SVD Matlab 实现
SVD Matlab Implementation
我尝试编写将矩阵分解为其 SVD 形式的 matlab 代码。
"Theory":
为了得到 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
代码中有什么错误或 "theory" 导致了错误?
特征向量不是唯一的(因为根据定义 Av==λv
,任何具有 μw==v
和 μ~=0
的 w
也是一个特征向量)。碰巧 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
的负值。
我尝试编写将矩阵分解为其 SVD 形式的 matlab 代码。
"Theory":
为了得到 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
代码中有什么错误或 "theory" 导致了错误?
特征向量不是唯一的(因为根据定义 Av==λv
,任何具有 μw==v
和 μ~=0
的 w
也是一个特征向量)。碰巧 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
的负值。