wolffd@0: function sS = som_vs2to1(sS) wolffd@0: wolffd@0: %SOM_VS2TO1 Convert version 2 struct to version 1. wolffd@0: % wolffd@0: % sSold = som_vs2to1(sSnew) wolffd@0: % wolffd@0: % sMold = som_vs2to1(sMnew); wolffd@0: % sDold = som_vs2to1(sDnew); wolffd@0: % wolffd@0: % Input and output arguments: wolffd@0: % sSnew (struct) a SOM Toolbox version 2 struct wolffd@0: % sSold (struct) a SOM Toolbox version 1 struct wolffd@0: % wolffd@0: % For more help, try 'type som_vs2to1' or check out online documentation. wolffd@0: % See also SOM_SET, SOM_VS1TO2. wolffd@0: wolffd@0: %%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: % wolffd@0: % som_vs2to1 wolffd@0: % wolffd@0: % PURPOSE wolffd@0: % wolffd@0: % Converts SOM Toolbox version 2 structs to version 1 structs. wolffd@0: % wolffd@0: % SYNTAX wolffd@0: % wolffd@0: % sS1 = som_vs2to1(sS2) wolffd@0: % wolffd@0: % DESCRIPTION wolffd@0: % wolffd@0: % This function is offered to allow the change of new map and data structs wolffd@0: % to old ones. There are quite a lot of changes between the versions, wolffd@0: % especially in the map struct, and this function makes it possible to wolffd@0: % use the old functions with new structs. wolffd@0: % wolffd@0: % Note that part of the information is lost in the conversion. Especially, wolffd@0: % training history is lost, and the normalization is, except in the simplest wolffd@0: % cases (like all have 'range' or 'var' normalization) screwed up. wolffd@0: % wolffd@0: % REQUIRED INPUT ARGUMENTS wolffd@0: % wolffd@0: % sS2 (struct) som SOM Toolbox version 2.0 struct (map, data, wolffd@0: % training or normalization struct) wolffd@0: % wolffd@0: % OUTPUT ARGUMENTS wolffd@0: % wolffd@0: % sS1 (struct) the corresponding SOM Toolbox version 2.0 struct wolffd@0: % wolffd@0: % EXAMPLES wolffd@0: % wolffd@0: % sM = som_vs2to1(sMnew); wolffd@0: % sD = som_vs2to1(sDnew); wolffd@0: % sT = som_vs2to1(sMnew.trainhist(1)); wolffd@0: % wolffd@0: % SEE ALSO wolffd@0: % wolffd@0: % som_set Set values and create SOM Toolbox structs. wolffd@0: % som_vs1to2 Transform structs from 1.0 version to 2.0. wolffd@0: wolffd@0: % Copyright (c) 1999-2000 by the SOM toolbox programming team. wolffd@0: % http://www.cis.hut.fi/projects/somtoolbox/ wolffd@0: wolffd@0: % Version 2.0beta juuso 101199 wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% check arguments wolffd@0: wolffd@0: error(nargchk(1, 1, nargin)); % check no. of input arguments is correct wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% set field values wolffd@0: wolffd@0: switch sS.type, wolffd@0: case 'som_map', wolffd@0: msize = sS.topol.msize; wolffd@0: [munits dim] = size(sS.codebook); wolffd@0: wolffd@0: % topology wolffd@0: if strcmp(sS.topol.shape,'sheet'), shape = 'rect'; wolffd@0: else shape = sS.shape; wolffd@0: end wolffd@0: wolffd@0: % labels wolffd@0: labels = cell(munits,1); wolffd@0: nl = size(sS.labels,2); wolffd@0: for i=1:munits, wolffd@0: labels{i} = cell(nl,1); wolffd@0: for j=1:nl, labels{i}{j} = sS.labels{i,j}; end wolffd@0: end wolffd@0: wolffd@0: % trainhist wolffd@0: tl = length(sS.trainhist); wolffd@0: if tl==0 | strcmp(sS.trainhist(1).algorithm,'lininit'), wolffd@0: init_type = 'linear'; wolffd@0: else wolffd@0: init_type = 'random'; wolffd@0: end wolffd@0: if tl>1, wolffd@0: for i=2:tl, wolffd@0: train_seq{i-1} = som_vs2to1(sS.trainhist(i)); wolffd@0: end wolffd@0: train_type = sS.trainhist(tl).algorithm; wolffd@0: else wolffd@0: train_seq = []; wolffd@0: train_type = 'batch'; wolffd@0: end wolffd@0: if tl>0, data_name = sS.trainhist(tl).data_name; else data_name = ''; end wolffd@0: wolffd@0: % component normalizations wolffd@0: sN = convert_normalizations(sS.comp_norm); wolffd@0: if strcmp(sN.name,'som_hist_norm'), wolffd@0: sS.codebook = redo_hist_norm(sS.codebook,sS.comp_norm,sN); wolffd@0: end wolffd@0: wolffd@0: % map wolffd@0: sSnew = struct('init_type', 'linear', 'train_type', 'batch', 'lattice' ,... wolffd@0: 'hexa', 'shape', 'rect', 'neigh', 'gaussian', 'msize', msize, ... wolffd@0: 'train_sequence', [], 'codebook', [], 'labels', [], ... wolffd@0: 'mask', [], 'data_name', 'unnamed', 'normalization', [], ... wolffd@0: 'comp_names', [], 'name', 'unnamed'); wolffd@0: sSnew.init_type = init_type; wolffd@0: sSnew.train_type = train_type; wolffd@0: sSnew.lattice = sS.topol.lattice; wolffd@0: sSnew.shape = shape; wolffd@0: sSnew.neigh = sS.neigh; wolffd@0: sSnew.msize = sS.topol.msize; wolffd@0: sSnew.train_sequence = train_seq; wolffd@0: sSnew.codebook = reshape(sS.codebook,[sS.topol.msize dim]); wolffd@0: sSnew.labels = labels; wolffd@0: sSnew.mask = sS.mask; wolffd@0: sSnew.data_name = data_name; wolffd@0: sSnew.normalization = sN; wolffd@0: sSnew.comp_names = sS.comp_names; wolffd@0: sSnew.name = sS.name; wolffd@0: wolffd@0: case 'som_data', wolffd@0: [dlen dim] = size(sS.data); wolffd@0: wolffd@0: % component normalizations wolffd@0: sN = convert_normalizations(sS.comp_norm); wolffd@0: if strcmp(sN.name,'som_hist_norm'), wolffd@0: sS.codebook = redo_hist_norm(sS.codebook,sS.comp_norm,sN); wolffd@0: end wolffd@0: wolffd@0: % data wolffd@0: sSnew = struct('data', [], 'name', '', 'labels' , [], 'comp_names', ... wolffd@0: [], 'normalization', []); wolffd@0: sSnew.data = sS.data; wolffd@0: sSnew.name = sS.name; wolffd@0: sSnew.labels = sS.labels; wolffd@0: sSnew.comp_names = sS.comp_names; wolffd@0: sSnew.normalization = sN; wolffd@0: wolffd@0: case 'som_norm', wolffd@0: sSnew = struct('name','som_var_norm','inv_params',[]); wolffd@0: wolffd@0: switch sS.method, wolffd@0: case 'var', sSnew.name = 'som_var_norm'; wolffd@0: case 'range', sSnew.name = 'som_lin_norm'; wolffd@0: case 'histD', sSnew.name = 'som_hist_norm'; wolffd@0: otherwise, wolffd@0: warning(['Method ' method ' does not exist in version 1.']) wolffd@0: end wolffd@0: wolffd@0: if strcmp(sS.status,'done'), wolffd@0: switch sS.method, wolffd@0: case 'var', wolffd@0: sSnew.inv_params = zeros(2,1); wolffd@0: sSnew.inv_params(1) = sS.params(1); wolffd@0: sSnew.inv_params(2) = sS.params(2); wolffd@0: case 'range', wolffd@0: sSnew.inv_params = zeros(2,1); wolffd@0: sSnew.inv_params(1) = sS.params(1); wolffd@0: sSnew.inv_params(2) = sS.params(2) + sS.params(1);; wolffd@0: case 'histD', wolffd@0: bins = length(sS.params); wolffd@0: sSnew.inv_params = zeros(bins+1,1) + Inf; wolffd@0: sSnew.inv_params(1:bins,i) = sS.params; wolffd@0: sSnew.inv_params(end,i) = bins; wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: case 'som_train', wolffd@0: sSnew = struct('algorithm', sS.algorithm, 'radius_ini', ... wolffd@0: sS.radius_ini, 'radius_fin', sS.radius_fin, 'alpha_ini', ... wolffd@0: sS.alpha_ini, 'alpha_type', sS.alpha_type, 'trainlen', sS.trainlen, ... wolffd@0: 'qerror', NaN, 'time', sS.time); wolffd@0: wolffd@0: case 'som_topol', wolffd@0: disp('Version 1 of SOM Toolbox did not have topology structure.\n'); wolffd@0: wolffd@0: otherwise, wolffd@0: wolffd@0: error('Unrecognized struct.'); wolffd@0: end wolffd@0: wolffd@0: sS = sSnew; wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% subfunctions wolffd@0: wolffd@0: function sN = convert_normalizations(cnorm) wolffd@0: wolffd@0: dim = length(cnorm); wolffd@0: sN = struct('name','som_var_norm','inv_params',[]); wolffd@0: wolffd@0: % check that there is exactly one normalization per component wolffd@0: % and that their status and method is the same wolffd@0: ok = 1; wolffd@0: nof = zeros(dim,1); wolffd@0: for i=1:dim, nof(i) = length(cnorm{i}); end wolffd@0: if any(nof>1), ok=0; wolffd@0: elseif any(nof==1) & any(nof==0), ok=0; wolffd@0: elseif any(nof>0), wolffd@0: status = cnorm{1}.status; wolffd@0: method = cnorm{1}.method; wolffd@0: for i=2:dim, wolffd@0: if ~strcmp(cnorm{i}.status,status) | ~strcmp(cnorm{i}.method,method), wolffd@0: ok = 0; wolffd@0: end wolffd@0: end wolffd@0: elseif all(nof==0), wolffd@0: return; wolffd@0: end wolffd@0: if ~ok, wolffd@0: warning(['Normalization could not be converted. All variables can' ... wolffd@0: ' only be normalized with a single, and same, method.']); wolffd@0: return; wolffd@0: end wolffd@0: wolffd@0: % method name wolffd@0: switch method, wolffd@0: case 'var', sN.name = 'som_var_norm'; wolffd@0: case 'range', sN.name = 'som_lin_norm'; wolffd@0: case 'histD', sN.name = 'som_hist_norm'; wolffd@0: otherwise, wolffd@0: warning(['Normalization could not be converted. Method ' method ... wolffd@0: 'does not exist in version 1.']); wolffd@0: return; wolffd@0: end wolffd@0: wolffd@0: % if not done, inv_params is empty wolffd@0: if ~strcmp(status,'done'), return; end wolffd@0: wolffd@0: % ok, make the conversion wolffd@0: switch method, wolffd@0: case 'var', wolffd@0: sN.inv_params = zeros(2,dim); wolffd@0: for i=1:dim, wolffd@0: sN.inv_params(1,i) = cnorm{i}.params(1); wolffd@0: sN.inv_params(2,i) = cnorm{i}.params(2); wolffd@0: end wolffd@0: case 'range', wolffd@0: sN.inv_params = zeros(2,dim); wolffd@0: for i=1:dim, wolffd@0: sN.inv_params(1,i) = cnorm{i}.params(1); wolffd@0: sN.inv_params(2,i) = cnorm{i}.params(2) + cnorm{i}.params(1); wolffd@0: end wolffd@0: case 'histD', wolffd@0: bins = zeros(dim,1); wolffd@0: for i=1:dim, bins(i) = length(cnorm{i}.params); end wolffd@0: m = max(bins); wolffd@0: sN.inv_params = zeros(m+1,dim) + Inf; wolffd@0: for i=1:dim, wolffd@0: sN.inv_params(1:bins(i),i) = cnorm{i}.params; wolffd@0: if bins(i) 0 & ind < n_bins(j), wolffd@0: D(i, j) = ind + 1; wolffd@0: else wolffd@0: D(i, j) = ind; wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: D = D * sparse(diag(1 ./ n_bins)); wolffd@0: wolffd@0: