changeset 171:e8428989412f danieleb

Added dictionary decorrelation functions and test script for Letters paper.
author Daniele Barchiesi <daniele.barchiesi@eecs.qmul.ac.uk>
date Thu, 06 Oct 2011 14:33:52 +0100
parents 68fb71aa5339
children 9c41f87dead7
files util/classes/dictionaryMatrices/shrinkgram.m
diffstat 1 files changed, 67 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/util/classes/dictionaryMatrices/shrinkgram.m	Thu Oct 06 14:33:52 2011 +0100
@@ -0,0 +1,67 @@
+function [dic mus] = shrinkgram(dic,mu,dd1,dd2,params)
+% grassmanian attempts to create an n by m matrix with minimal mutual
+% coherence using an iterative projection method.
+%
+% [A G res] = grassmanian(n,m,nIter,dd1,dd2,initA)
+%
+% REFERENCE
+% M. Elad, Sparse and Redundant Representations, Springer 2010.
+
+%% Parameters and Defaults
+if ~nargin, testshrinkgram; return; end
+
+if ~exist('dd2','var')   || isempty(dd2),   dd2 = 0.9; end %shrinking factor
+if ~exist('dd1','var')   || isempty(dd1),   dd1 = 0.9; end %percentage of coherences to be shrinked
+if ~exist('params','var') || isempty(params), params = struct; end
+if ~isfield(params,'nIter'), params.nIter = 100; end
+
+%% Main algo
+dic = normc(dic);	%normalise columns
+G = dic'*dic;		%gram matrix
+[n m] = size(dic);
+
+MU  = @(G) max(max(abs(G-diag(diag(G))))); %coherence function
+
+mus   = ones(params.nIter,1);
+iIter = 1;
+% optimise gram matrix
+while iIter<=params.nIter && MU(G)>mu
+	mus(iIter) = MU(G);		%calculate coherence
+	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
+	iIter = iIter+1;
+end
+%if iIter<params.nIter
+%	mus(iIter:end) = mus(iIter-1);
+%end
+
+[V_gram Sigma_gram] = svd(G);				%calculate svd decomposition of gramian
+dic = sqrt(Sigma_gram(1:n,:))*V_gram';		%update dictionary
+
+function testshrinkgram
+clc
+%define parameters
+n = 256;							%ambient dimension
+m = 512;							%number of atoms
+N = 1024;							%number of signals
+mu_min = sqrt((m-n)/(n*(m-1)));		%minimum coherence
+
+%initialise data
+phi = normc(randn(n,m));			%dictionary
+
+%optimise dictionary
+[~, mus] = shrinkgram(phi,0.2);
+
+%plot results
+nIter = length(mus);
+
+figure, hold on
+plot(1:nIter,mus,'ko-');
+plot([1 nIter],[mu_min mu_min],'k')
+grid on
+legend('\mu','\mu_{min}');