comparison DL/two-step DL/dico_decorr.m @ 164:4205744092e6 release_1.9

Merge from branch "ivand_dev"
author Ivan Damnjanovic lnx <ivan.damnjanovic@eecs.qmul.ac.uk>
date Wed, 07 Sep 2011 14:17:30 +0100
parents 485747bf39e0
children a4d0977d4595
comparison
equal deleted inserted replaced
151:af5abc34a5e1 164:4205744092e6
1 function dico = dico_decorr(dico, mu, amp)
2 %DICO_DECORR decorrelate a dictionary
3 % Parameters:
4 % dico: the dictionary
5 % mu: the coherence threshold
6 % amp: the amplitude coefficients, only used to decide which atom to
7 % project
8 %
9 % Result:
10 % dico: a dictionary close to the input one with coherence mu.
11
12 % compute atom weights
13 if nargin > 2
14 rank = sum(amp.*amp, 2);
15 else
16 rank = randperm(length(dico));
17 end
18
19 % several decorrelation iterations might be needed to reach global
20 % coherence mu. niter can be adjusted to needs.
21 niter = 1;
22 while niter < 5 && ...
23 max(max(abs(dico'*dico -eye(length(dico))))) > mu + 10^-6
24 % find pairs of high correlation atoms
25 colors = dico_color(dico, mu);
26
27 % iterate on all pairs
28 nbColors = max(colors);
29 for c = 1:nbColors
30 index = find(colors==c);
31 if numel(index) == 2
32 % decide which atom to change (the one with lowest weight)
33 if rank(index(1)) < rank(index(2))
34 index = fliplr(index);
35 end
36
37 % update the atom
38 corr = dico(:,index(1))'*dico(:,index(2));
39 alpha = sqrt((1-mu*mu)/(1-corr*corr));
40 beta = corr*alpha-mu*sign(corr);
41 dico(:,index(2)) = alpha*dico(:,index(2))...
42 -beta*dico(:,index(1));
43 end
44 end
45 niter = niter+1;
46 end
47 end
48