wolffd@0: function sS = som_vs1to2(sS) wolffd@0: wolffd@0: %SOM_VS1TO2 Convert version 1 structure to version 2. wolffd@0: % wolffd@0: % sSnew = som_vs1to2(sSold) wolffd@0: % wolffd@0: % sMnew = som_vs1to2(sMold); wolffd@0: % sDnew = som_vs1to2(sDold); wolffd@0: % wolffd@0: % Input and output arguments: wolffd@0: % sSold (struct) a SOM Toolbox version 1 structure wolffd@0: % sSnew (struct) a SOM Toolbox version 2 structure wolffd@0: % wolffd@0: % For more help, try 'type som_vs1to2' or check out online documentation. wolffd@0: % See also SOM_SET, SOM_VS2TO1. wolffd@0: wolffd@0: %%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: % wolffd@0: % som_vs1to2 wolffd@0: % wolffd@0: % PURPOSE wolffd@0: % wolffd@0: % Transforms SOM Toolbox 1 version structs from to 2 version structs. wolffd@0: % wolffd@0: % SYNTAX wolffd@0: % wolffd@0: % sS2 = som_vs1to2(sS1) wolffd@0: % wolffd@0: % DESCRIPTION wolffd@0: % wolffd@0: % This function is offered to allow the change of old map and data structs wolffd@0: % to new ones. There are quite a lot of changes between the versions, wolffd@0: % especially in the map struct, and this function makes it easy to update wolffd@0: % the structs. wolffd@0: % wolffd@0: % WARNING! wolffd@0: % wolffd@0: % 'som_unit_norm' normalization type is not supported by version 2, wolffd@0: % so this type of normalization will be lost. wolffd@0: % wolffd@0: % REQUIRED INPUT ARGUMENTS wolffd@0: % wolffd@0: % sS1 (struct) any SOM Toolbox version 1 struct (map, data, wolffd@0: % training or normalization struct) wolffd@0: % wolffd@0: % OUTPUT ARGUMENTS wolffd@0: % wolffd@0: % sS2 (struct) the corresponding SOM Toolbox 2 version struct wolffd@0: % wolffd@0: % EXAMPLES wolffd@0: % wolffd@0: % sM = som_vs1to2(sMold); wolffd@0: % sD = som_vs1to2(sDold); wolffd@0: % sT = som_vs1to2(sMold.train_sequence{1}); wolffd@0: % sN = som_vs1to2(sDold.normalization); wolffd@0: % wolffd@0: % SEE ALSO wolffd@0: % wolffd@0: % som_set Set values and create SOM Toolbox structs. wolffd@0: % som_vs2to1 Transform structs from version 2.0 to 1.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: if isfield(sS,'codebook'), type='som_map'; wolffd@0: elseif isfield(sS,'data'), type='som_data'; wolffd@0: elseif isfield(sS,'algorithm'), type = 'som_train'; wolffd@0: elseif isfield(sS,'inv_params'), type = 'som_norm'; wolffd@0: else wolffd@0: error('Unrecognized input struct.'); wolffd@0: end wolffd@0: wolffd@0: switch type, wolffd@0: case 'som_map', wolffd@0: msize = sS.msize; munits = prod(msize); dim = prod(size(sS.codebook))/munits; wolffd@0: M = reshape(sS.codebook,[munits dim]); wolffd@0: wolffd@0: % topology wolffd@0: if strcmp(sS.shape,'rect'), shape = 'sheet'; else shape = sS.shape; end wolffd@0: sTopol = struct('type','som_topol','msize',msize,'lattice',sS.lattice,'shape',shape); wolffd@0: wolffd@0: % labels wolffd@0: labels = cell(munits,1); wolffd@0: for i=1:munits, wolffd@0: for j=1:length(sS.labels{i}), labels{i,j} = sS.labels{i}{j}; end wolffd@0: end wolffd@0: wolffd@0: % trainhist wolffd@0: tl = length(sS.train_sequence); wolffd@0: if strcmp(sS.init_type,'linear'); alg = 'lininit'; else alg = 'randinit'; end wolffd@0: trh = struct('type','som_train'); wolffd@0: trh.algorithm = alg; wolffd@0: trh.neigh = sS.neigh; wolffd@0: trh.mask = sS.mask; wolffd@0: trh.data_name = sS.data_name; wolffd@0: trh.radius_ini = NaN; wolffd@0: trh.radius_fin = NaN; wolffd@0: trh.alpha_ini = NaN; wolffd@0: trh.alpha_type = ''; wolffd@0: trh.trainlen = NaN; wolffd@0: trh.time = ''; wolffd@0: for i=1:tl, wolffd@0: trh(i+1) = som_vs1to2(sS.train_sequence{i}); wolffd@0: trh(i+1).mask = sS.mask; wolffd@0: trh(i+1).neigh = sS.neigh; wolffd@0: trh(i+1).data_name = sS.data_name; wolffd@0: end wolffd@0: wolffd@0: % component normalizations wolffd@0: cnorm = som_vs1to2(sS.normalization); wolffd@0: if isempty(cnorm), wolffd@0: cnorm = cell(dim,1); wolffd@0: elseif length(cnorm) ~= dim, wolffd@0: warning('Incorrect number of normalizations. Normalizations ignored.\n'); wolffd@0: cnorm = cell(dim,1); wolffd@0: else wolffd@0: if strcmp(cnorm{1}.method,'histD'), wolffd@0: M = redo_hist_norm(M,sS.normalization.inv_params,cnorm); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: % map wolffd@0: sSnew = struct('type','som_map'); wolffd@0: sSnew.codebook = M; wolffd@0: sSnew.topol = sTopol; wolffd@0: sSnew.labels = labels; wolffd@0: sSnew.neigh = sS.neigh; wolffd@0: sSnew.mask = sS.mask; wolffd@0: sSnew.trainhist = trh; wolffd@0: sSnew.name = sS.name; wolffd@0: sSnew.comp_norm = cnorm; wolffd@0: sSnew.comp_names = sS.comp_names; wolffd@0: wolffd@0: case 'som_data', wolffd@0: [dlen dim] = size(sS.data); wolffd@0: wolffd@0: % component normalizations wolffd@0: cnorm = som_vs1to2(sS.normalization); wolffd@0: if isempty(cnorm), wolffd@0: cnorm = cell(dim,1); wolffd@0: elseif length(cnorm) ~= dim, wolffd@0: warning('Incorrect number of normalizations. Normalizations ignored.\n'); wolffd@0: cnorm = cell(dim,1); wolffd@0: else wolffd@0: if strcmp(cnorm{1}.method,'histD'), wolffd@0: sS.data = redo_hist_norm(sS.data,sS.normalization.inv_params,cnorm); wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: % data wolffd@0: sSnew = struct('type','som_data'); 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.comp_norm = cnorm; wolffd@0: sSnew.label_names = []; wolffd@0: wolffd@0: case 'som_norm', wolffd@0: if isempty(sS.inv_params), wolffd@0: sSnew = []; wolffd@0: else wolffd@0: dim = size(sS.inv_params,2); wolffd@0: sSnew = cell(dim,1); wolffd@0: switch sS.name, wolffd@0: case 'som_var_norm', method = 'var'; wolffd@0: case 'som_lin_norm', method = 'range'; wolffd@0: case 'som_hist_norm', method = 'histD'; wolffd@0: case 'som_unit_norm', method = ''; wolffd@0: warning(['Normalization method ''som_unit_norm'' is not available' ... wolffd@0: ' in version 2 of SOM Toolbox.\n']); wolffd@0: end wolffd@0: if ~isempty(method), wolffd@0: for i=1:dim, wolffd@0: sSnew{i} = struct('type','som_norm'); wolffd@0: sSnew{i}.method = method; wolffd@0: sSnew{i}.params = []; wolffd@0: sSnew{i}.status = 'done'; wolffd@0: switch method, wolffd@0: case 'var', wolffd@0: me = sS.inv_params(1,i); st = sS.inv_params(2,i); wolffd@0: sSnew{i}.params = [me, st]; wolffd@0: case 'range', wolffd@0: mi = sS.inv_params(1,i); ma = sS.inv_params(2,i); wolffd@0: sSnew{i}.params = [mi, ma-mi]; wolffd@0: case 'histD', wolffd@0: vals = sS.inv_params(1:(end-1),i); wolffd@0: bins = sum(isfinite(vals)); wolffd@0: vals = vals(1:bins); wolffd@0: sSnew{i}.params = vals; wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: case 'som_train', wolffd@0: sSnew = struct('type','som_train'); wolffd@0: sSnew.algorithm = sS.algorithm; wolffd@0: sSnew.neigh = 'gaussian'; wolffd@0: sSnew.mask = []; wolffd@0: sSnew.data_name = 'unknown'; wolffd@0: sSnew.radius_ini = sS.radius_ini; wolffd@0: sSnew.radius_fin = sS.radius_fin; wolffd@0: sSnew.alpha_ini = sS.alpha_ini; wolffd@0: sSnew.alpha_type = sS.alpha_type; wolffd@0: sSnew.trainlen = sS.trainlen; wolffd@0: sSnew.time = sS.time; wolffd@0: wolffd@0: case 'som_topol', wolffd@0: disp('Version 1.0 of SOM Toolbox did not have topology structure.\n'); wolffd@0: wolffd@0: case {'som_grid','som_vis'} wolffd@0: disp('Version 1.0 of SOM Toolbox did not have visualization structs.\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 D = redo_hist_norm(D,inv_params,cnorm) wolffd@0: wolffd@0: dim = size(D,2); wolffd@0: wolffd@0: % first - undo the old way wolffd@0: n_bins = inv_params(end,:); wolffd@0: D = round(D * sparse(diag(n_bins))); wolffd@0: for i = 1:dim, wolffd@0: if any(isnan(D(:, i))), D(isnan(D(:, i)), i) = n_bins(i); end wolffd@0: D(:, i) = inv_params(D(:, i), i); wolffd@0: end wolffd@0: % then - redo the new way wolffd@0: for i=1:dim, wolffd@0: bins = length(cnorm{i}.params); wolffd@0: x = D(:,i); wolffd@0: inds = find(~isnan(x) & ~isinf(x))'; wolffd@0: for j = inds, wolffd@0: [dummy ind] = min(abs(x(j) - cnorm{i}.params)); wolffd@0: if x(j) > cnorm{i}.params(ind) & ind < bins, x(j) = ind + 1; wolffd@0: else x(j) = ind; wolffd@0: end wolffd@0: end wolffd@0: D(:,i) = (x-1)/(bins-1); wolffd@0: end wolffd@0: wolffd@0: wolffd@0: wolffd@0: