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

时间:2013-04-17 06:49:42

标签: matlab opencv linear-algebra svd

我想知道为什么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 个答案:

答案 0 :(得分: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')。

答案 1 :(得分:3)

SVD的结果不一定是唯一的。例如,I = UIV'对于任何单一的V = U.你上面给出的例子特别是排名不足,所以没有理由期待唯一性。

答案 2 :(得分:2)

奇异值分解仅定义为符号; U和V的符号是任意的,如果它们在MATLAB和OpenCV之间不同,则表明没有问题。