gpt4 book ai didi

matlab - SVD Matlab 实现

转载 作者:太空宇宙 更新时间:2023-11-03 19:54:54 27 4
gpt4 key购买 nike

我尝试编写将矩阵分解为其 SVD 形式的 matlab 代码。

“理论”:

为了得到 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 的负数用你的算法找到。

关于matlab - SVD Matlab 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35665090/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com