Matlab SVD输出在OpenCV中的应用

4
在Matlab的SVD函数中,输出三个矩阵:
[U,S,V] = svd(X) 

我们可以使用S矩阵来找到最小的组件数量,以减少X的维数并保留足够的方差。我的问题是如何使用OpenCV找到S矩阵(而不是U矩阵)?是否可以使用内置的OpenCV SVD函数找到S矩阵?我的意思是,OpenCV SVD函数输出三个矩阵,就像Matlab一样,但我不知道它们是否相同。

SVD::compute(InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags=0 ) 

这是Matlab中的奇异值分解(SVD):

[U,S,V] = svd(X).

谢谢你。
2个回答

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的元素放在对角线上。


3
我非常确定用于计算SVD分解的后端代码在MATLAB和OpenCV中是相同的(我认为两种情况都使用LAPACK完成)。因此,您想要做的似乎很容易。您可以通过创建一个与src大小相同且所有位置都为零值的矩阵,并且在对角线上填充w中的值,将w转换为S。这仅仅是一个简单的数据结构更改,值将保持不变。

2
在2.4及更高版本中,SVD实现是opencv自己的,取代了lapack。对于小矩阵来说,它要高效得多。 - Martin Beckett
2
@MartinBeckett:他们的自定义实现性能存在争议:http://code.opencv.org/issues/1498,http://code.opencv.org/issues/3018,http://comments.gmane.org/gmane.comp.lib.opencv/50836。 - Amro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接