4

在 Matlab SVD 函数中输出三个矩阵:

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

我们可以使用 S 矩阵找到尽可能少的分量,以减少 X 的维数以保留足够的方差。我的问题是如何使用 OpenCV 找到S矩阵(不是U矩阵),是否可以使用 OpenCV SVD 中的构建找到 S 矩阵?我的意思是 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).

谢谢你。

4

2 回答 2

9

SMatlab 和wOpenCV之间有一个简单的区别。

举个例子:

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

于 2012-08-19T21:57:38.230 回答
3

我很确定实际计算 SVD 分解的后端对于 MATLAB 和 OpenCV 是相同的(我认为在这两种情况下都是用 LAPACK 完成的)。所以你想要做的似乎很容易。

您可以通过创建一个与 src 大小相同且处处为零且 w 中的值沿对角线的矩阵来将 w 转换为 S。这只是数据结构的简单更改,值将是相同的。

于 2012-08-19T21:53:54.110 回答