
//////////////////////////////////////////////////////
// Compression d'image

// Proposition de code Scilab pour comparer compression
// par SVD et SSVD.
// A est supposee carree et size(A)=[N,N] avec N=n*n

function X=shuffle(A,N,n)
X=zeros(A);

for i=1:n:N
  for j=1:n:N
    Bloc=A( i:i+n-1, j:j+n-1 );               // extraction bloc
    ligne=floor((i-1)/n)*n+floor((j-1)/n)+1;  // calcul numero de ligne associe
    X(ligne,:)= matrix(Bloc',1,N);            // bloc ecrit ligne/ligne dans la ligne numero "ligne"
  end                                        // d'où l'utilisation de la tranposée Bloc'
end
endfunction

function B=shuffle_inv(X,N,n)
B=zeros(X);

for i=1:n:N
  for j=1:n:N
      ligne=floor((i-1)/n)*n+floor((j-1)/n)+1;  
      B( i:i+n-1, j:j+n-1 )= matrix(X(ligne,:),n,n)';
  end
end
endfunction

function comp_svd_ssvd()
loadmatfile("-ascii","image.asc");
N=196
n=14
A=image(1:N,1:N);  // image verifiant hyp. sur dimensions
// autre possibilite, completer par zeros...

xset("colormap",graycolormap(256));
Matplot(A);

[U,S,V]=svd(A);

X=shuffle(A,N,n);
[U1,S1,V1]=svd(X);  

for k=50:-10:10
  scf();
  xset("colormap",graycolormap(256));
 
  Ak=U(:,1:k)*S(1:k,1:k)*V(:,1:k)';
  subplot(1,2,1)
  Matplot(Ak);
  xtitle("SVD, k="+string(k));
 
  Xk=U1(:,1:k)*S1(1:k,1:k)*V1(:,1:k)';
  B=shuffle_inv(Xk,N,n);
  subplot(1,2,2) 
  Matplot(B);
  xtitle("SSVD, k="+string(k));
end
endfunction
