Я попытался написать код Matlab, который бы разложил матрицу в ее форму SVD.Реализация SVD Matlab
«Теория»:
Чтобы получить U, я нашел собственные векторы АА», и получить V, я нашел собственные векторы А'А. Наконец, Sigma является матрицей той же размерности, что и A, с корнем собственных значений на диагонали в упорядоченной последовательности.
Однако, похоже, что это не работает должным образом. похоже, возвращается с коэффициентом -1
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»:
ans =
-2.0000 -4.0000 -1.0000 -3.0000
0.0000 0.0000 -2.0000 -1.0000
Что ошибка в коде или„теории“, что привело к этому?
Я писал об этом в мае прошлого года: [Расчет SVD вручную] (http://math.stackexchange.com/a/1805239/339790). –