opencv中的Matlab SVD输出

时间:2012-08-19 19:51:37

标签: matlab opencv svd

Matlab中的

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).

谢谢。

2 个答案:

答案 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为沿对角线的值。它只是一个简单的数据结构变化,值将是相同的。