在Matlab中,SVD函数输出三个矩阵:
[U,S,V] = svd(X)
我们可以使用S矩阵来找到尽可能少的分量,以降低X的维数以保留足够的方差。我的问题是如何使用Opencv找到S
矩阵(而不是U
矩阵),是否可以使用OpenCV SVD中的build找到S矩阵?我的意思是,Matlab奇异值分解函数输出三个矩阵,就像OpenCV一样,但我不知道它们是否相同。这是OpenCV中的奇异值分解:
SVD::compute(InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags=0 )
这是Matlab奇异值分解:
[U,S,V] = svd(X).
谢谢。
发布于 2012-08-19 21:57:38
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
的元素放在它的对角线上。
发布于 2012-08-19 21:53:54
我非常确定,实际计算奇异值分解的后端对于MATLAB和OpenCV是相同的(我认为这两种情况都是用LAPACK完成的)。所以你想做的事情看起来很简单。
您可以通过创建一个具有相同大小的src矩阵来将w转换为S,该矩阵到处都是零,并且w中的值沿对角线。这只是一个简单的数据结构的改变,值将是相同的。
https://stackoverflow.com/questions/12029486
复制相似问题