SVD函数输出三个矩阵:
[U,S,V] = svd(X)
我们可以使用S Matrix找到最小可能数量的组件,以减少X的维数以保持足够的方差。
我的问题是如何使用Opencv找到S
矩阵(而不是U
矩阵),是否可以使用OpenCV SVD中的内部版本找到S Matrix?我的意思是OpenCV SVD函数输出三个矩阵,如Matlab一个,但我不知道它们是否相同。
这是OpenCV中的SVD:
SVD::compute(InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags=0 )
这是Matlab SVD:
[U,S,V] = svd(X).
谢谢。
答案 0 :(得分:9)
Matlab中的S
和OpenCV中的w
之间存在简单的区别。
举个例子:
A = [2, 4;
1, 3;
0, 0;
0, 0]
在Matlab中,S
将是:
S = [5.47, 0 ;
0 , 0.37;
0 , 0 ;
0 , 0 ]
但是openCV给出了以下w
:
w = [5.47; 0.37]
因此,OpenCV给出一个奇异值数组,如果你真的想要有S矩阵,你可以创建一个新矩阵并将w
的元素放在对角线上。
答案 1 :(得分:3)
我很确定实际计算SVD分解的后端对于MATLAB和OpenCV来说是相同的(我想在两种情况下都是用LAPACK完成的)。所以你想做的事情似乎很容易。
您可以通过创建一个相同大小的src矩阵,将w转换为S,其中零到处为零,w为沿对角线的值。它只是一个简单的数据结构变化,值将是相同的。