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



我想知道为什么在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

我知道它们使用相同的算法,为什么有符号差异?由于

您使用的是哪个版本的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')。

SVD的结果不必是唯一的。例如,对于任何酉型V = u, I = iv '。上面给出的例子是秩缺乏的,因此没有理由期望唯一性。

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

相关内容

  • 没有找到相关文章

最新更新