annotate toolboxes/MIRtoolbox1.3.2/somtoolbox/som_mdist.m @ 0:cc4b1211e677 tip

initial commit to HG from Changeset: 646 (e263d8a21543) added further path and more save "camirversion.m"
author Daniel Wolff
date Fri, 19 Aug 2016 13:07:06 +0200
parents
children
rev   line source
Daniel@0 1 function Md = som_mdist(D,q,mask,Ne)
Daniel@0 2
Daniel@0 3 % SOM_MDIST Mutual (or pairwise) distance matrix for the given data.
Daniel@0 4 %
Daniel@0 5 % Md = som_mdist(D,[q],[mask],[Ne])
Daniel@0 6 %
Daniel@0 7 % Md = som_mdist(D);
Daniel@0 8 % Md = som_mdist(D,Inf);
Daniel@0 9 % Md = som_mdist(D,2,Ne);
Daniel@0 10 %
Daniel@0 11 % Input and output arguments ([]'s are optional):
Daniel@0 12 % D (matrix) size dlen x dim, the data set
Daniel@0 13 % (struct) map or data struct
Daniel@0 14 % [q] (scalar) distance norm, default = 2
Daniel@0 15 % [mask] (vector) size dim x 1, the weighting mask
Daniel@0 16 % [Ne] (matrix) size dlen x dlen, sparse matrix
Daniel@0 17 % indicating which distances should be
Daniel@0 18 % calculated (ie. less than Infinite)
Daniel@0 19 %
Daniel@0 20 % See also PDIST.
Daniel@0 21
Daniel@0 22 % Copyright (c) 2000 by Juha Vesanto
Daniel@0 23 % Contributed to SOM Toolbox on XXX by Juha Vesanto
Daniel@0 24 % http://www.cis.hut.fi/projects/somtoolbox/
Daniel@0 25
Daniel@0 26 % Version 2.0beta juuso 220800
Daniel@0 27
Daniel@0 28 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 29
Daniel@0 30 % mask
Daniel@0 31 if nargin<3, mask = []; end
Daniel@0 32
Daniel@0 33 % the data
Daniel@0 34 if isstruct(D),
Daniel@0 35 switch D.type,
Daniel@0 36 case 'som_map', if isempty(mask), mask = D.mask; end, D = D.codebook;
Daniel@0 37 case 'som_data', D = D.data;
Daniel@0 38 otherwise, error('Bad first argument');
Daniel@0 39 end
Daniel@0 40 end
Daniel@0 41 nans = sum(isnan(D),2);
Daniel@0 42 if any(nans>0),
Daniel@0 43 D(find(nans>0),:) = 0;
Daniel@0 44 warning('Distances of vectors with NaNs are not calculated.');
Daniel@0 45 end
Daniel@0 46 [dlen dim] = size(D);
Daniel@0 47
Daniel@0 48 % distance norm
Daniel@0 49 if nargin<2 | isempty(q) | isnan(q), q = 2; end
Daniel@0 50
Daniel@0 51 % mask
Daniel@0 52 if isempty(mask), mask = ones(dim,1); end
Daniel@0 53
Daniel@0 54 % connections
Daniel@0 55 if nargin<4, Ne = []; end
Daniel@0 56 if ~isempty(Ne),
Daniel@0 57 l = size(Ne,1); Ne([0:l-1]*l+[1:l]) = 1; % set diagonal elements = 1
Daniel@0 58 end
Daniel@0 59
Daniel@0 60 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 61
Daniel@0 62 m = mask;
Daniel@0 63 o = ones(dlen,1);
Daniel@0 64 l = dlen;
Daniel@0 65 Md = zeros(dlen);
Daniel@0 66 calculate_all = isempty(Ne);
Daniel@0 67
Daniel@0 68 if ~calculate_all, Md(Ne==0) = Inf; end
Daniel@0 69
Daniel@0 70 for i=1:l-1,
Daniel@0 71 j=(i+1):l;
Daniel@0 72 if ~calculate_all, j=find(Ne(i,j))+i; end
Daniel@0 73 C=D(j,:)-D(i*o(1:length(j)),:);
Daniel@0 74 switch q,
Daniel@0 75 case 1, Md(j,i)=abs(C)*m;
Daniel@0 76 case 2, Md(j,i)=sqrt((C.^2)*m);
Daniel@0 77 case Inf, Md(j,i)=max(diag(m)*abs(C),[],2);
Daniel@0 78 otherwise, Md(j,i)=((abs(C).^q)*m).^(1/q);
Daniel@0 79 end
Daniel@0 80 Md(i,j) = Md(j,i)';
Daniel@0 81 end
Daniel@0 82
Daniel@0 83 Md(find(nans>0),:) = NaN;
Daniel@0 84 Md(:,find(nans>0)) = NaN;
Daniel@0 85
Daniel@0 86 return;
Daniel@0 87
Daniel@0 88 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 89