diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_mdist.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/somtoolbox/som_mdist.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,89 @@
+function Md = som_mdist(D,q,mask,Ne)
+
+% SOM_MDIST Mutual (or pairwise) distance matrix for the given data.
+% 
+%   Md = som_mdist(D,[q],[mask],[Ne])
+%
+%    Md = som_mdist(D); 
+%    Md = som_mdist(D,Inf); 
+%    Md = som_mdist(D,2,Ne); 
+%
+%  Input and output arguments ([]'s are optional):
+%   D        (matrix) size dlen x dim, the data set
+%            (struct) map or data struct
+%   [q]      (scalar) distance norm, default = 2
+%   [mask]   (vector) size dim x 1, the weighting mask
+%   [Ne]     (matrix) size dlen x dlen, sparse matrix 
+%                     indicating which distances should be 
+%                     calculated (ie. less than Infinite) 
+%
+% See also PDIST. 
+
+% Copyright (c) 2000 by Juha Vesanto
+% Contributed to SOM Toolbox on XXX by Juha Vesanto
+% http://www.cis.hut.fi/projects/somtoolbox/
+ 
+% Version 2.0beta juuso 220800
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% mask
+if nargin<3, mask = []; end
+
+% the data
+if isstruct(D), 
+  switch D.type, 
+   case 'som_map', if isempty(mask), mask = D.mask; end, D = D.codebook; 
+   case 'som_data', D = D.data; 
+   otherwise, error('Bad first argument');
+  end
+end
+nans = sum(isnan(D),2);
+if any(nans>0), 
+  D(find(nans>0),:) = 0; 
+  warning('Distances of vectors with NaNs are not calculated.'); 
+end
+[dlen dim] = size(D);
+
+% distance norm
+if nargin<2 | isempty(q) | isnan(q), q = 2; end
+
+% mask
+if isempty(mask), mask = ones(dim,1); end
+
+% connections 
+if nargin<4, Ne = []; end
+if ~isempty(Ne), 
+  l = size(Ne,1); Ne([0:l-1]*l+[1:l]) = 1; % set diagonal elements = 1
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+m = mask; 
+o = ones(dlen,1); 
+l = dlen; 
+Md = zeros(dlen);
+calculate_all = isempty(Ne); 
+
+if ~calculate_all, Md(Ne==0) = Inf; end
+
+for i=1:l-1,
+  j=(i+1):l; 
+  if ~calculate_all, j=find(Ne(i,j))+i; end
+  C=D(j,:)-D(i*o(1:length(j)),:);
+  switch q, 
+   case 1,    Md(j,i)=abs(C)*m;
+   case 2,    Md(j,i)=sqrt((C.^2)*m);  
+   case Inf,  Md(j,i)=max(diag(m)*abs(C),[],2);
+   otherwise, Md(j,i)=((abs(C).^q)*m).^(1/q);
+  end   
+  Md(i,j) = Md(j,i)';
+end
+
+Md(find(nans>0),:) = NaN; 
+Md(:,find(nans>0)) = NaN; 
+
+return;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+