为什么SVD离开用Eigen和OpenCV计算的奇异向量有不同的符号

Mic*_*ine 2 c++ algorithm math opencv eigen

我使用OpenCV和Eigen来计算SVD:

Eigen:
JacobiSVD<Matrix3f> svd(myM, ComputeFullU);

OpenCV:
cvSVD(&myM, &w, &u, 0, CV_SVD_MODIFY_A | CV_SVD_U_T);
Run Code Online (Sandbox Code Playgroud)

我专注于左奇异向量:

Eigen result:
 0.0341698  -0.064916   0.997306
  0.950241  -0.307051 -0.0525437
  0.309635   0.949476   0.051194

OpenCV result:
[0.03417001163639093, -0.06491612525262211, 0.9973055233913801;
  -0.9502414121501213, 0.3070511298822651, 0.05254390804810754;
  -0.3096347347112595, -0.9494764348419663, -0.05119404985032185]
Run Code Online (Sandbox Code Playgroud)

尽管一个是浮点型而另一个是双类型,但计算的左奇异向量具有不同的符号.所以我的问题是:

  1. 这种符号差异真的很重要吗?
  2. 如何使它们一样?

vso*_*tco 5

  1. 不,这没关系,因为相应的符号差异也会出现在右侧奇异向量上,所以基本上也是如此

    U * S * V^adjoint
    
    Run Code Online (Sandbox Code Playgroud)

    会给你正确的结果.

    更准确地说,来自维基百科:

    非简并奇异值总是具有唯一的左奇异向量和右奇异向量,直到乘以单位相位因子 exp(i?)(对于真实情况直到符号).因此,如果M的所有奇异>值都是非简并且非零,则其奇异值分解是唯一的,直到U的列乘以单位相位因子并且同时将V的相应列乘以相同的单位相位因子.

  2. 你为什么要他们一样?如果你真的想要,你可以通过划分第一个组件来获得相位,然后通过乘以该相位使它们相等.

  3. 由于奇异值的排序,也可能出现另外的差异,afaik eigen按递减顺序排序,不确定opencv.