首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opencv中的Matlab SVD输出

opencv中的Matlab SVD输出
EN

Stack Overflow用户
提问于 2012-08-20 03:51:37
回答 2查看 4.1K关注 0票数 4

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

代码语言:javascript
复制
[U,S,V] = svd(X) 

我们可以使用S矩阵来找到尽可能少的分量,以降低X的维数以保留足够的方差。我的问题是如何使用Opencv找到S矩阵(而不是U矩阵),是否可以使用OpenCV SVD中的build找到S矩阵?我的意思是,Matlab奇异值分解函数输出三个矩阵,就像OpenCV一样,但我不知道它们是否相同。这是OpenCV中的奇异值分解:

代码语言:javascript
复制
SVD::compute(InputArray src, OutputArray w, OutputArray u, OutputArray vt, int flags=0 ) 

这是Matlab奇异值分解:

代码语言:javascript
复制
[U,S,V] = svd(X).

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-20 05:57:38

Matlab中的S和OpenCV中的w有一个简单的区别。

举个例子:

代码语言:javascript
复制
A = [2, 4;
     1, 3;
     0, 0;
     0, 0]

在Matlab中,S应该是:

代码语言:javascript
复制
S = [5.47, 0   ;
     0   , 0.37;
     0   , 0   ;
     0   , 0   ]

但是openCV以w的身份给出了以下内容

代码语言:javascript
复制
w = [5.47; 0.37]

所以,OpenCV给出了一个奇异值的数组,如果你真的想要S矩阵,你可以创建一个新的矩阵,并把w的元素放在它的对角线上。

票数 9
EN

Stack Overflow用户

发布于 2012-08-20 05:53:54

我非常确定,实际计算奇异值分解的后端对于MATLAB和OpenCV是相同的(我认为这两种情况都是用LAPACK完成的)。所以你想做的事情看起来很简单。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12029486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档