function svdhello; % SVDHELLO shows "image compression" using SVD % first build A=HELLO bl=ones(8,6); H=bl; H(1:3,3:4)=zeros(3,2); H(6:8,3:4)=zeros(3,2); E=bl; E(3,3:6)=zeros(1,4); E(6,3:6)=zeros(1,4); L=bl; L(1:6,3:6)=zeros(6,4); O=bl; O(3:6,3:4)=zeros(4,2); A=zeros(15,40); A(2:9,2:7)=H; A(3:10,10:15)=E; A(4:11,18:23)=L; A(5:12,26:31)=L; A(6:13,34:39)=O; subplot(3,3,1), spy(A), title('spy(HELLO); note rank(HELLO)=10') surfit(2,flipud(A)), title('HELLO = U \Sigma V* as an image') % use SVD for various "compressions" [U,S,V]=svd(A); c=7; surfit(3,flipud(U(:,1:c)*S(1:c,1:c)*V(:,1:c)')) title('rank 7 approximation to HELLO') c=5; surfit(4,flipud(U(:,1:c)*S(1:c,1:c)*V(:,1:c)')) title('rank 5 approx = \Sigma_{k=1}^5 \sigma_k u_k v_k*') c=3; surfit(5,flipud(U(:,1:c)*S(1:c,1:c)*V(:,1:c)')) title('rank 3 approx = \Sigma_{k=1,2,3} \sigma_k u_k v_k*') c=2; surfit(6,flipud(U(:,1:c)*S(1:c,1:c)*V(:,1:c)')) title('rank 2 approx = \Sigma_{k=1,2} \sigma_k u_k v_k*') c=1; surfit(7,flipud(U(:,1:c)*S(1:c,1:c)*V(:,1:c)')) title('\sigma_1 u_1 v_1* = (rank 1 approx)') c=2; surfit(8,flipud(U(:,c)*S(c,c)*V(:,c)')), title('\sigma_2 u_2 v_2*') c=3; surfit(9,flipud(U(:,c)*S(c,c)*V(:,c)')), title('\sigma_3 u_3 v_3*') % helper function function surfit(pos,B); subplot(3,3,pos), surf(B), view(2), colorbar, shading interp axis([1 40 1 15]), set(gca,'XTick',[]), set(gca,'YTick',[])