我试图编写一个将矩阵分解为SVD格式的matlab代码。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 *西格玛* V”似乎为-1的因子返回:
ans =
-2.0000 -4.0000 -1.0000 -3.0000
0.0000 0.0000 -2.0000 -1.0000
什么代码或‘理论’,导致它的错误呢?
我在去年5月写了这篇文章:[手工计算SVD](http://math.stackexchange.com/a/1805239/339790)。 –