Mercurial > hg > smallbox
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