Mercurial > hg > camir-aes2014
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; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +