SVD的Matlab实现

SVD的Matlab实现,matlab,svd,Matlab,Svd,我试图编写matlab代码,将矩阵分解为SVD形式 “理论”: 为了得到U,我找到了AA'的特征向量,为了得到V,我找到了A'A的特征向量。最后,Sigma是一个与A维数相同的矩阵,特征值的根按顺序排列在对角线上 然而,它似乎不能正常工作 A=[2 4 1 3; 0 0 2 1]; % Get U, V [aatVecs, aatVals] = eig(A*A'); [~, aatPermutation] = sort(sum(aatVals), 'descend'); U = aatVecs

我试图编写matlab代码,将矩阵分解为SVD形式

“理论”:

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

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

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:

ans =

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

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

特征向量不是唯一的(因为
Av==λv
根据定义,任何
w
具有
μw==v
μ~=0
也是特征向量)。因此,
eig
返回的特征向量与SVD的匹配方式不正确(即使它们已标准化)

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

U = [A*V(:,1)./singularValues(1) A*V(:,2)./singularValues(2)];

事实上,
A==U*sigma*V'
,特别是这里找到的
U
正是用你的算法找到的
U
的负数。

虽然特征向量不是唯一的,但归一化的特征向量应该是,no?@AnaM no,因为
norm(V)=norm(-V)
,使用
n
特征向量,你就有了
2^n
正交向量的组合。第一个元素为正的约定不会解决这个问题吗?我在去年5月写过这篇文章:。