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

标签 matlab opencv linear-algebra svd

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

          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')。

关于matlab - SVD 在 Matlab 和 OpenCV 中计算不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16053380/

相关文章:

c++ - 打开简历。 detectMultiScale() 函数返回错误

algorithm - 如何将一条线反射到另一条线上

julia,线性代数,是否有一个函数可以找到与给定向量正交的所有向量?

javascript - 将贝塞尔曲线分成相等的两半

c# - 将 MATLAB 与 C# 集成

matlab - 在 MATLAB 中查找卡方分布的分位数值

Matlab:sign()函数的傅里叶系数正在振荡

matlab - Matlab 中的矢量化像素加倍插值

c++ - 录像机的多线程

c++ - 使用 CMake 和 NMake 构建 OpenCV 3.0 时出现链接错误