diff DL/two-step DL/dico_color_separate.m @ 200:69ce11724b1f luisf_dev

Added dictionary decorrelation for multiple dictionaries
author bmailhe
date Tue, 20 Mar 2012 12:25:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DL/two-step DL/dico_color_separate.m	Tue Mar 20 12:25:50 2012 +0000
@@ -0,0 +1,95 @@
+function [colors nbColors] = dico_color_separate(dico, mu)
+    % DICO_COLOR cluster several dictionaries in pairs of high correlation
+    % atoms. Called by dico_decorr.
+    %
+    % Parameters:
+    % -dico: the dictionaries
+    % -mu: the correlation threshold
+    %
+    % Result:
+    % -colors: a cell array of indices. Two atoms with the same color have
+    % a correlation greater than mu
+    
+    
+    numDico = length(dico);
+    colors = cell(numDico,1);
+    for i = 1:numDico
+        colors{i} = zeros(length(dico{i}),1);
+    end
+    
+    G = cell(numDico);
+    
+    % compute the correlations
+    for i = 1:numDico
+        for j = i+1:numDico
+            G{i,j} = abs(dico{i}'*dico{j});
+        end
+    end
+    
+    % iterate on the correlations higher than mu
+    c = 1;
+    [maxCorr, i, j, m, n] = findMaxCorr(G);
+    while maxCorr > mu
+        % find the highest correlated pair
+        
+        % color them
+        colors{i}(m) = c;
+        colors{j}(n) = c;
+        c = c+1;
+        
+        % make sure these atoms never get selected again
+        % Set to zero relevant lines in the Gram Matrix
+        for j2 = i+1:numDico
+            G{i,j2}(m,:) = 0;
+        end
+        
+        for i2 = 1:i-1
+            G{i2,i}(:,m) = 0;
+        end
+        
+        for j2 = j+1:numDico
+            G{j,j2}(n,:) = 0;
+        end
+        
+        for i2 = 1:j-1
+            G{i2,j}(:,n) = 0;
+        end
+        
+        % find the next correlation
+        [maxCorr, i, j, m, n] = findMaxCorr(G);
+    end
+    
+    % complete the coloring with singletons
+    % index = find(colors==0);
+    % colors(index) = c:c+length(index)-1;
+    nbColors = c-1;
+end
+
+function [val, i, j, m, n] = findMaxCorr(G)
+    %FINDMAXCORR find the maximal correlation in the cellular Gram matrix
+    %
+    %   Input:
+    %   -G: the Gram matrix
+    %
+    %   Output:
+    %   -val: value of the correlation
+    %   -i,j,m,n: indices of the argmax. The maximal correlation is reached
+    %   for the m^th atom of the i^th dictionary and the n^h atom of the
+    %   j^h dictionary
+    
+    val = -1;
+    for tmpI = 1:length(G)
+        for tmpJ = tmpI+1:length(G)
+            [tmpVal tmpM] = max(G{tmpI,tmpJ},[],1);
+            [tmpVal tmpN] = max(tmpVal);
+            if tmpVal > val
+                val = tmpVal; 
+                i = tmpI;
+                j = tmpJ;
+                n = tmpN;
+                m = tmpM(n);
+            end
+        end
+    end
+end
+        
\ No newline at end of file