idamnjanovic@10: function [dist,ratio] = dictdist(approxD,D,epsilon) idamnjanovic@10: %DICTDIST Distance between dictionaries. idamnjanovic@10: % [DIST,RATIO] = DICTDIST(APPROXD,D) computes the distance between the idamnjanovic@10: % approximate dictionary APPROXD and the true dictionary D, where APPROXD idamnjanovic@10: % is NxK and D is NxM. idamnjanovic@10: % idamnjanovic@10: % The distance between the dictionary APPROXD and a single atom A of D is idamnjanovic@10: % defined as: idamnjanovic@10: % idamnjanovic@10: % DIST(APPROXD,A) = min { 1-abs(APPROXD(:,i)' * A) } idamnjanovic@10: % i idamnjanovic@10: % idamnjanovic@10: % The distance between the dictionaries APPROXD and D is defined as: idamnjanovic@10: % idamnjanovic@10: % DIST(APPROXD,D) = sum { dist(APPROXD, D(:,k)) } / M idamnjanovic@10: % k idamnjanovic@10: % idamnjanovic@10: % Note that 0 <= DIST(APPROXD,D) <= 1, where 0 implies that all atoms in D idamnjanovic@10: % appear in APPROXD, and 1 implies that the atoms of D are orthogonal to idamnjanovic@10: % APPROXD. idamnjanovic@10: % idamnjanovic@10: % The similarity ratio between APPROXD and D is defined as: idamnjanovic@10: % idamnjanovic@10: % RATIO(APPROXD,D) = #(atoms in D that appear in APPROXD) / M idamnjanovic@10: % idamnjanovic@10: % where two atoms are considered identical when DIST(A1,A2) < EPSILON with idamnjanovic@10: % EPSILON=0.01 by default. Note that 0 <= RATIO(APPROXD,D) <= 1, where 0 idamnjanovic@10: % means APPROXD and D have no identical atoms, and 1 means that all atoms idamnjanovic@10: % of D appear in APPROXD. idamnjanovic@10: % idamnjanovic@10: % [DIST,RATIO] = DICTDIST(DICT1,DICT2,EPSILON) specifies a different value idamnjanovic@10: % for EPSILON. idamnjanovic@10: idamnjanovic@10: % Ron Rubinstein idamnjanovic@10: % Computer Science Department idamnjanovic@10: % Technion, Haifa 32000 Israel idamnjanovic@10: % ronrubin@cs idamnjanovic@10: % idamnjanovic@10: % October 2007 idamnjanovic@10: idamnjanovic@10: idamnjanovic@10: if (nargin < 3), epsilon = 0.01; end idamnjanovic@10: idamnjanovic@10: [n,m] = size(D); idamnjanovic@10: idamnjanovic@10: approxD = normcols(approxD*spdiag(sign(approxD(1,:)))); idamnjanovic@10: D = normcols(D*spdiag(sign(D(1,:)))); idamnjanovic@10: idamnjanovic@10: identical_atoms = 0; idamnjanovic@10: dist = 0; idamnjanovic@10: idamnjanovic@10: for i = 1:m idamnjanovic@10: atom = D(:,i); idamnjanovic@10: distances = 1-abs(atom'*approxD); idamnjanovic@10: mindist = min(distances); idamnjanovic@10: dist = dist + mindist; idamnjanovic@10: identical_atoms = identical_atoms + (mindist < epsilon); idamnjanovic@10: end idamnjanovic@10: idamnjanovic@10: dist = dist / m; idamnjanovic@10: ratio = identical_atoms / m;