首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SVD Matlab实现

SVD Matlab实现
EN

Stack Overflow用户
提问于 2016-02-27 02:47:21
回答 1查看 3K关注 0票数 5

我试图编写matlab代码,将矩阵分解成它的SVD形式。

“理论”:

为了得到U,我找到了AA‘的特征向量,得到了V,找到了A’的特征向量。最后,Sigma是一个与A相同维数的矩阵,其特征值在有序序列的对角线上。

然而,它似乎不能正常工作。

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

% Get U, V
[aatVecs, aatVals] = eig(A*A');
[~, aatPermutation] = sort(sum(aatVals), 'descend');
U = aatVecs(:, aatPermutation);

[ataVecs, ataVals] = eig(A'*A);
[~, ataPermutation] = sort(sum(ataVals), 'descend');
V = ataVecs(:, ataPermutation);

% Get Sigma
singularValues = sum(aatVals(:, aatPermutation)).^0.5;
sigma=zeros(size(A));
for i=1:nnz(singularValues)
    sigma(i, i) = singularValues(i);
end

A
U*sigma*V'

U* sigma * V‘似乎以-1的因子返回:

代码语言:javascript
复制
ans =

-2.0000   -4.0000   -1.0000   -3.0000
0.0000    0.0000   -2.0000   -1.0000

导致它的代码或“理论”中的错误是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-27 07:42:30

特征向量并不是唯一的(因为根据定义,任何带有Av==λvμ~=0w都是特征向量)。碰巧,eig返回的特征向量在奇异值分解中并不匹配(即使它们是标准化的)。

然而,一旦我们有了U,我们就可以构造V,在您的算法中,我们会发现它是A'*A的特征向量。一旦找到了V作为排序的特征向量,就必须找到U来匹配。由于V是正交的,A*V == U*sigma。所以我们可以

代码语言:javascript
复制
U = [A*V(:,1)./singularValues(1) A*V(:,2)./singularValues(2)];

实际上,A == U*sigma*V',特别是这里找到的U,正是您的算法中发现的U的负数。

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

https://stackoverflow.com/questions/35665090

复制
相关文章

相似问题

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