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

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

4

3 回答 3

12

您使用的是哪个版本的 OpenCV?

http://code.opencv.org/issues/1498 看来,最近版本的 OpenCV 似乎不再使用 LAPACK 来执行 SVD(我认为是 Matlab 使用的)。因此,使用相同算法的假设可能不正确。

当然 YY=U S V'

如果你否定 U 和 V 的第一列:

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

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

于 2013-04-19T07:28:43.327 回答
3

SVD 的结果不必是唯一的。例如,对于任何单一的 V = U,I = UIV'。您在上面给出的示例特别是秩不足,因此没有理由期望唯一性。

于 2014-07-23T20:16:20.357 回答
2

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

于 2014-05-18T10:26:15.333 回答