我想知道为什么在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之间不同,这并不表明有问题。