diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_write_cod.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_write_cod.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,187 @@
+function som_write_cod(sMap, filename)
+
+%SOM_WRITE_COD Writes a map struct to ascii file in SOM_PAK format.
+%
+% som_write_cod(sMap,filename)
+%
+%  som_write_cod(sMap,'map1.cod');
+%
+%  Input and output arguments: 
+%   sMap        (struct) self-organizing map structure
+%   filename    (string) name of input file
+%
+% Note that much of the information in the map struct is lost.
+% Typically, when saving map structs into files use the 'save' command.
+%
+% For more help, try 'type som_write_cod' or check out online documentation.
+% See also SOM_READ_COD, SOM_READ_DATA, SOM_WRITE_DATA.
+
+%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% som_write_cod
+%
+% PURPOSE
+%
+% Writes a self-organizing map struct to a file in SOM_PAK format.
+%
+% SYNTAX
+%
+%  som_write_cod(sMap,filename); 
+%
+% DESCRIPTION
+%
+% This function is offered for compatibility with SOM_PAK, a SOM 
+% software package in C. It writes map struct to files in SOM_PAK format.
+%
+% See SOM_READ_COD for description of the SOM_PAK map file format.
+% Because the SOM_PAK package does not support many of the features and
+% options of the SOM Toolbox, some of the information is changed, or even
+% lost. 
+%
+% SOM_PAK does not support 3- or higher dimensional map grids. These cannot
+%         be exported using this function.  
+% SOM_PAK always supposes that the map has 'sheet' shape. 
+% SOM_PAK only supports 'bubble' and 'gaussian' neighborhood functions.
+%         Any other neighborhood function is changed to 'gaussian'.
+% SOM_PAK doesn't support component names. However, the component names are
+%         written on a comment line which begins with '#n '. Any spaces (' ') 
+%         in the component names are replaced with underscores ('_').      
+% Information on map name, mask, training history and normalizations is lost.
+%
+% This function is only offered for compatibility with SOM_PAK. In general,
+% when saving map structs in files, use 'save filename.mat sMap'. This is
+% faster and retains all information of the map.
+% 
+% REQUIRED INPUT ARGUMENTS
+%
+%  sMap       (struct) the SOM struct to be written
+%  filename   (string) the name of the input file
+%
+% EXAMPLES
+%
+%  som_write_cod(sMap,'map1.cod');
+%
+% SEE ALSO
+% 
+%  som_read_cod     Read a map from a file in SOM_PAK format.
+%  som_read_data    Reads data from an ascii file.
+%  som_write_data   Writes data struct into a file in SOM_PAK format.
+
+% Copyright (c) 1997-2000 by the SOM toolbox programming team.
+% http://www.cis.hut.fi/projects/somtoolbox/
+
+% Version 1.0beta ecco 221097
+% Version 2.0beta ecco 030899, juuso 151199
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% check arguments and initialize
+
+error(nargchk(2, 2, nargin))  % check no. of input args is correct
+
+% sMap
+msize = sMap.topol.msize;           % map grid size
+mdim  = length(msize);              % map grid dimension
+[munits dim] = size(sMap.codebook); % input space dimension
+
+% map dimension check:
+% map dimensions higher than 2 are not supported by SOM_PAK
+if mdim > 2,      
+  error('Cannot write maps with higher dimension than two');
+end
+
+% in SOM_PAK the xy-indexing is used, while in Matlab ij-indexing
+% therefore, the codebook vectors have to be reorganized 
+order = reshape([1:munits],msize);
+order = reshape(order',[munits 1]);
+msize = fliplr(msize);
+
+% open output file
+fid = fopen(filename, 'w');
+if fid < 0,
+  error(['Cannot open file ' filename]);
+end
+
+% check version
+v = version;
+ver_53_or_newer = (str2num(v(1:3)) >= 5.3);
+
+
+[lines numlabs] = size(sMap.labels);
+has_labels = zeros(lines, 1);
+if ver_53_or_newer
+  has_labels = sum((~(cellfun('isempty', sMap.labels))), 2);
+else
+  for i = 1:lines
+    for j = 1:numlabs
+      if ~isempty(sMap.labels{i,j}) 
+	has_labels(i) = 1; break; 
+      end
+    end
+  end
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% write map into a file
+
+% write header
+
+fprintf(fid, '%d %s ', dim, sMap.topol.lattice); % dimension and lattice
+fprintf(fid, '%d ', msize);                      % map size
+% neighborhood type ('ep' and 'cutgauss' are not supported by SOM_PAK; 
+% they are converted to 'gaussian')
+if strcmp(sMap.neigh,'bubble'), fprintf(fid, 'bubble\n');
+else 
+  if ~strcmp(sMap.neigh,'gaussian'), 
+    warning(['Neighborhood type ''' sMap.neigh ''' converted to ''gaussian''']);
+  end
+  fprintf(fid,'gaussian\n'); 
+end
+
+% write the component names as a SOM_PAK comment line
+
+fprintf(fid,'#n ');
+for i=1:dim, fprintf(fid, '%s ', strrep(sMap.comp_names{i},' ','_')); end
+fprintf(fid,'\n');
+
+% write codebook
+
+form  = [repmat('%g ',[1 dim]) '\n'];
+if ~has_labels  % no labels; fast
+  fprintf(fid, form, sMap.codebook(order,:)');
+else            % has labels; slow
+  for i=1:munits, 
+    fprintf(fid, '%g ', sMap.codebook(order(i),:));
+
+    if has_labels(order(i))
+      temp = '';
+      if ver_53_or_newer
+	nonempty = ~(cellfun('isempty', sMap.labels(i,:)));
+      else
+	for j = 1:numlabs, nonempty(j) = ~isempty(sMap.labels{i, j}); end
+      end
+      labs = char(sMap.labels{order(i), nonempty});
+      labs(:,end + 1) = ' ';
+      temp = reshape(labs',[1 prod(size(labs))]);
+      temp(findstr('  ', temp))='';
+      fprintf(fid, '%s\n', temp(1:end-1));
+    else
+      fprintf(fid, '\n');
+    end
+  end
+end
+
+% close file
+
+if fclose(fid) 
+  error(['Cannot close file ' filename]);
+else
+  fprintf(2, 'map write ok\n');
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+
+
+