在Matlab和OpenCV中计算SVD得到不同的结果

15

我想知道为什么在Matlab和OpenCV中计算SVD时结果存在符号差异。我输入的是同一矩阵。

          3.65E+06  -2.09E+06   0
 YY =    -2.09E+06  2.45E+06    0
           0         0          0

[U,S,V] = svd(YY);//Matlab


        -0.798728902689475  0.601691066917623   0
   V =  0.601691066917623   0.798728902689475   0
         0                  0                   1

cv::SVD::compute(YY, S, U, V);//opencv

     0.798839   -0.601544   0
V =  0.601544   0.798839    0
     0          0           1

我知道他们使用相同的算法,为什么会有符号差异呢?谢谢。

3个回答

12

您使用的OpenCV版本是哪个?

http://code.opencv.org/issues/1498可以看出,最近的OpenCV版本不再使用LAPACK来做SVD(与Matlab使用的方式不同),因此假设正在使用相同的算法可能是不正确的。

当然,YY=USV'。

如果您对U和V的第一列取反:

U(:,1)=-U(:,1);
V(:,1)=-V(:,1)

您会发现 USV' 仍等于 YY。这适用于您的特定情况,因为 YY 是对称的(YY = YY')。


3
SVD的结果不一定是唯一的。例如,对于任何酉矩阵V=U,都有I=UIV'。特别地,您上面给出的示例具有秩缺失,因此不应期望唯一性。

2
奇异值分解只有一个符号是定义的;U和V的符号是任意的,如果它们在MATLAB和OpenCV之间不同,这并不表示有问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接