Matlab SVD вопрос

У меня есть следующий код Matlab:

r=5;
[U, Gamma, V] = svd( rand(20,10), 'econ' );

L1 = U(:,1:r) * Gamma(1:r,1:r) * V(:,1:r)';

L2 = zeros(20,10); 
for i=1:r
    L2 = L2 + Gamma(i)* U(:,i) * V(:,i)';
end

norm(L1-L2,'fro')

Обычно L1 должен быть таким же, как L2, а norm(L1-L2,'fro') в результате должен давать ноль. Однако это не тот случай, когда я набираю приведенные выше команды в командном окне Matlab.

Может ли кто-нибудь помочь мне определить проблему здесь?


person Shawn    schedule 11.02.2014    source источник


Ответы (1)


так должно быть

L2 = L2 + Gamma(i,i)* U(:,i) * V(:,i)';
person michaeltang    schedule 11.02.2014
comment
Да, Gamma — диагональная матрица, а не вектор. Другое исправление состоит в том, чтобы включить строку Gamma = diag(Gamma);, тогда Gamma(i) будет работать так, как ожидается в цикле. - person Nicu Stiurca; 11.02.2014
comment
Прошу прощения за мою ошибку! - person Shawn; 11.02.2014