wolffd@0: function d=som_eucdist2(Data, Proto) wolffd@0: wolffd@0: %SOM_EUCDIST2 Calculates matrix of squared euclidean distances between set of vectors or map, data struct wolffd@0: % wolffd@0: % d=som_eucdist2(D, P) wolffd@0: % wolffd@0: % d=som_eucdist(sMap, sData); wolffd@0: % d=som_eucdist(sData, sMap); wolffd@0: % d=som_eucdist(sMap1, sMap2); wolffd@0: % d=som_eucdist(datamatrix1, datamatrix2); wolffd@0: % wolffd@0: % Input and output arguments ([]'s are optional): wolffd@0: % D (matrix) size Nxd wolffd@0: % (struct) map or data struct wolffd@0: % P (matrix) size Pxd wolffd@0: % (struct) map or data struct wolffd@0: % d (matrix) distance matrix of size NxP wolffd@0: % wolffd@0: % IMPORTANT wolffd@0: % wolffd@0: % * Calculates _squared_ euclidean distances wolffd@0: % * Observe that the mask in the map struct is not taken into account while wolffd@0: % calculating the euclidean distance wolffd@0: % wolffd@0: % See also KNN, PDIST. wolffd@0: wolffd@0: % Contributed to SOM Toolbox 2.0, October 29th, 2000 by Johan Himberg wolffd@0: % Copyright (c) by Johan Himberg wolffd@0: % http://www.cis.hut.fi/projects/somtoolbox/ wolffd@0: wolffd@0: % Version 2.0beta Johan 291000 wolffd@0: wolffd@0: %% Init %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: wolffd@0: if isstruct(Data); wolffd@0: if isfield(Data,'type') & ischar(Data.type), wolffd@0: ; wolffd@0: else wolffd@0: error('Invalid map/data struct?'); wolffd@0: end wolffd@0: switch Data.type wolffd@0: case 'som_map' wolffd@0: data=Data.codebook; wolffd@0: case 'som_data' wolffd@0: data=Data.data; wolffd@0: end wolffd@0: else wolffd@0: % is already a matrix wolffd@0: data=Data; wolffd@0: end wolffd@0: wolffd@0: % Take prototype vectors from prototype struct wolffd@0: wolffd@0: if isstruct(Proto), wolffd@0: wolffd@0: if isfield(Proto,'type') & ischar(Proto.type), wolffd@0: ; wolffd@0: else wolffd@0: error('Invalid map/data struct?'); wolffd@0: end wolffd@0: switch Proto.type wolffd@0: case 'som_map' wolffd@0: proto=Proto.codebook; wolffd@0: case 'som_data' wolffd@0: proto=Proto.data; wolffd@0: end wolffd@0: else wolffd@0: % is already a matrix wolffd@0: proto=Proto; wolffd@0: end wolffd@0: wolffd@0: % Check that inputs are matrices wolffd@0: if ~vis_valuetype(proto,{'nxm'}) | ~vis_valuetype(data,{'nxm'}), wolffd@0: error('Prototype or data input not valid.') wolffd@0: end wolffd@0: wolffd@0: % Record data&proto sizes and check their dims wolffd@0: [N_data dim_data]=size(data); wolffd@0: [N_proto dim_proto]=size(proto); wolffd@0: if dim_proto ~= dim_data, wolffd@0: error('Data and prototype vector dimension does not match.'); wolffd@0: end wolffd@0: wolffd@0: % Calculate euclidean distances between classifiees and prototypes wolffd@0: d=distance(data,proto); wolffd@0: wolffd@0: %%%% Classification %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: function d=distance(X,Y); wolffd@0: wolffd@0: % Euclidean distance matrix between row vectors in X and Y wolffd@0: wolffd@0: U=~isnan(Y); Y(~U)=0; wolffd@0: V=~isnan(X); X(~V)=0; wolffd@0: d=abs(X.^2*U'+V*Y'.^2-2*X*Y');