%1.7 SVDcode.m %SVDcode not fast or numerically stable % input A, output orthogonal U,V and diagonal sigma with A=U*sigma*V' [m,n]=size(A); r=rank(A); [V,squares]=eig(A'*A); % n by n matrices sing=sqrt(squares(1:r,1:r)); % r by r, singular values >0 on diagonal sigma=zeros(m,n); sigma(1:r,1:r)=sing; % m by n singular value matrix UU=A*V(:,1:r)*inv(sing); % first r columns of U (singular vectors) [U,R]=qr(UU); U(:,1:r)=UU; % qr command completes UU to an m by m U A-U*sigma*V'; % test for zero m by n matrix (could print its norm)