Mercurial > hg > smallbox
changeset 162:88578ec2f94a danieleb
Updated grassmannian function and minor debugs
author | Daniele Barchiesi <daniele.barchiesi@eecs.qmul.ac.uk> |
---|---|
date | Wed, 31 Aug 2011 13:52:23 +0100 |
parents | e3035d45d014 |
children | 1495bdfa13e9 |
files | DL/two-step DL/SMALL_two_step_DL.m util/classes/dictionaryMatrices/grassmannian.m util/snr.m |
diffstat | 3 files changed, 39 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/DL/two-step DL/SMALL_two_step_DL.m Wed Aug 31 10:53:10 2011 +0100 +++ b/DL/two-step DL/SMALL_two_step_DL.m Wed Aug 31 13:52:23 2011 +0100 @@ -119,7 +119,7 @@ dico = dico_decorr(dico, mu, solver.solution); case 'tropp' [n m] = size(dico); - dico = grassmanian(n,m,[],[],[],dico,true); + dico = grassmannian(n,m,[],[],[],dico,true); otherwise end
--- a/util/classes/dictionaryMatrices/grassmannian.m Wed Aug 31 10:53:10 2011 +0100 +++ b/util/classes/dictionaryMatrices/grassmannian.m Wed Aug 31 13:52:23 2011 +0100 @@ -12,33 +12,41 @@ if ~exist('initA','var') || isempty(initA), initA = randn(n,m); end %initial matrix if ~exist('dd2','var') || isempty(dd2), dd2 = 0.95; end %shrinking factor if ~exist('dd1','var') || isempty(dd1), dd1 = 0.9; end %percentage of coherences to be shrinked -if ~exist('nIter','var') || isempty(nIter), nIter = 5; end %number of iterations +if ~exist('nIter','var') || isempty(nIter), nIter = 10; end %number of iterations -%% Compute svd and gramian +%% Main algo A = normc(initA); %normalise columns -[Uinit Sigma] = svd(A); %calculate svd of the matrix -G = A'*A; %gramian matrix +G = A'*A; %gram matrix -muMin = sqrt((m-n)/(n*(m-1))); %Lower bound on mutual coherence +muMin = sqrt((m-n)/(n*(m-1))); %Lower bound on mutual coherence (equiangular tight frame) res = zeros(nIter,1); -for iIter = 1:nIter - gg = sort(abs(G(:))); %sort inner products from less to ost correlated - pos = find(abs(G(:))>gg(round(dd1*(m^2-m))) & abs(G(:)-1)>1e-6); - G(pos) = G(pos)*dd2; - [U S V] = svd(G); - S(n+1:end,1+n:end) = 0; - G = U*S*V'; - G = diag(1./abs(sqrt(diag(G))))*G*diag(1./abs(sqrt(diag(G)))); - gg = sort(abs(G(:))); - pos = find(abs(G(:))>gg(round(dd1*(m^2-m))) & abs(G(:)-1)>1e-6); - res(iIter) = max(abs(G(pos))); - if verb - fprintf(1,'%6i %12.8f %12.8f %12.8f \n',... - [iIter,muMin,mean(abs(G(pos))),max(abs(G(pos)))]); - end +if verb + fprintf(1,'Iter mu_min mu \n'); end -[~, Sigma_gram V_gram] = svd(G); %calculate svd decomposition of gramian -Sigma_new = sqrt(Sigma_gram(1:n,:)).*sign(Sigma); -A = Uinit*Sigma_new*V_gram'; -A = normc(A); +% optimise gram matrix +for iIter = 1:nIter + gg = sort(abs(G(:))); %sort inner products from less to most correlated + pos = find(abs(G(:))>=gg(round(dd1*(m^2-m))) & abs(G(:)-1)>1e-6); %find large elements of gram matrix + G(pos) = G(pos)*dd2; %shrink large elements of gram matrix + [U S V] = svd(G); %compute new SVD of gram matrix + S(n+1:end,1+n:end) = 0; %set small eigenvalues to zero (this ensures rank(G)<=d) + G = U*S*V'; %update gram matrix + G = diag(1./abs(sqrt(diag(G))))*G*diag(1./abs(sqrt(diag(G)))); %normalise gram matrix diagonal + if verb + Geye = G - eye(size(G)); + fprintf(1,'%6i %12.8f %12.8f \n',iIter,muMin,max(abs(Geye(:)))); + end +end + +% [~, Sigma_gram V_gram] = svd(G); %calculate svd decomposition of gramian +% Sigma_new = sqrt(Sigma_gram(1:n,:)).*sign(Sigma); %calculate singular values of dictionary +% A = Uinit*Sigma_new*V_gram'; %update dictionary +% A = normc(A); %normalise dictionary + +[U S] = svd(G); %calculate svd decomposition of gramian +A = sqrt(S(1:n,1:n))*U(:,1:n)'; %calculate valid frame, s.t. A'*A=G + +% %% Debug visualization function +% function plotcart2d(A) +% compass(A(1,:),A(2,:));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/util/snr.m Wed Aug 31 13:52:23 2011 +0100 @@ -0,0 +1,6 @@ +function x = snr(s,r) +% SNR calculates the signal-to-noise ratio between the signal s and its +% representation r defined as: +% SNR = 20*log10(||s||_2/||s-r||_2) +err = s-r; +x = mag2db(norm(s(:))/norm(err(:))); \ No newline at end of file