diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_modify_dataset.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_modify_dataset.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,247 @@
+function sD = som_modify_dataset(sD,action,varargin)
+
+%SOM_MODIFY_DATASET Add or remove components or samples to/from a data struct.
+%
+% sD = som_modify_dataset(sD, 'addcomp', D, [indsto], [cnames})
+% sD = som_modify_dataset(sD, 'addsamp', D, [indsto], ['norm'])
+% sD = som_modify_dataset(sD, 'removecomp', [inds])
+% sD = som_modify_dataset(sD, 'removesamp', inds)
+% sD = som_modify_dataset(sD, 'extractcomp', [inds])
+% sD = som_modify_dataset(sD, 'extractsamp', inds)
+% sD = som_modify_dataset(sD, 'movecomp', inds, indsto)
+% sD = som_modify_dataset(sD, 'movesamp', inds, indsto)
+%
+%  Input and output arguments ([]'s are optional)
+%   sD      (struct) data struct
+%   action  (string) 'addcomp', 'addsamp', 'removecomp', 'removesamp', 
+%                    'extractcomp', 'extractsamp', 'movecomp', or 'movesamp' 
+%
+%   other input arguments depend on the action
+%
+%   'addcomp': 
+%   D        (matrix) data matrix, size [dlen x d]
+%            (struct) data struct, size of .data field [dlen x d]
+%   [indsto] (vector) new indeces of the components, length=d
+%   [cnames] (cellstr) of size d x 1, the component names
+%
+%   'addsamp': 
+%   D        (matrix) data matrix, size [n x dim] 
+%   [indsto] (vector) new indeces of the samples, length=n
+%   ['norm'] (string) specified if the normalization procedure
+%                     should be applied to the new samples
+%
+%   'removecomp', 'extractcomp': 
+%   [inds]   (vector) indeces of the components to be removed/extracted. 
+%                     If not given, a prompt will appear from which the
+%                     user can select the appropriate components.
+%
+%   'removesamp', 'extractsamp': 
+%   inds     (vector) indeces of the samples to be removed/extracted
+%
+%   'movecomp', 'movesamp': 
+%   inds     (vector) indeces of the components/samples to be moved
+%   indsto   (vector) new indeces of the components/samples 
+%
+% See also SOM_DATA_STRUCT.
+
+% Copyright (c) 2000 by Juha Vesanto
+% Contributed to SOM Toolbox on June 16th, 2000 by Juha Vesanto
+% http://www.cis.hut.fi/projects/somtoolbox/
+ 
+% Version 2.0beta juuso 200400 160600 280800
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% input arguments
+
+[dlen dim] = size(sD.data);
+
+switch action, 
+  case 'addcomp',  
+    D = varargin{1};     
+    if isstruct(D), [n d] = size(D.data); else [n d] = size(D); end
+    if n ~= dlen, error('The number of samples in the data struct and new data should match.'); end
+    indsto = []; 
+    cnames = []; 
+    for i=2:length(varargin), 
+      if isnumeric(varargin{i}), 
+	indsto = varargin{i}; 
+	if length(indsto) ~= d, 
+	  error('The number of indeces should match the number of new components'); 
+	end
+      else
+	if ischar(varargin{i}), cnames = cellstr(varargin{i}); 
+	elseif iscellstr(varargin{i}), cnames = varargin{i}; 
+	else
+	  error(['[som_modify_dataset] Unrecognized argument #' num2str(i+1)]); 
+	end	
+	if length(cnames) ~= d, 
+	  error('The number of component names should match the number of new components'); 
+	end
+      end
+    end
+ case 'addsamp',
+  D = varargin{1};
+  if isstruct(D), 
+    lab = D.labels; 
+    if isfield(D,'data'), D = D.data; else D = D.codebook; end
+  else lab = []; 
+  end
+  [n d] = size(D); 
+  if d ~= dim, 
+    error(['The dimensions of the old and new data sets should match.']); 
+  end
+  norm = 0; 
+  indsto = []; 
+  for i=2:length(varargin),
+    if ischar(varargin{i}) & strcmp(varargin{i},'norm'), norm = 1; 
+    elseif isnumeric(varargin{i}), 
+      indsto = varargin{i}; 
+      if length(indsto) ~= n, 
+	error(['The number of new indeces should match the number of new' ...
+	       ' samples']); 
+      end
+    else
+      warning(['[som_modify_dataset] Ignoring unrecognized argument #', ...
+	       num2str(i+2)]);
+    end
+  end
+ case 'removecomp',
+  if length(varargin)>0, 
+    inds = varargin{1};
+  else
+    [inds, ok] = listdlg('ListString',sD.comp_names, 'PromptString', ...
+                         'Components', 'Name', 'Remove components', 'uh', 25);
+    if ~ok, return; end
+  end
+  if min(inds)<1 | max(inds)>dim, 
+    error('The component indeces must be within [1,dim]'); 
+  end
+ case 'removesamp',
+  inds = varargin{1};
+  if min(inds)<1 | max(inds)>dlen, 
+    error('The sample indeces must be within [1,dlen]'); 
+  end
+ case 'extractcomp',
+  if length(varargin)>0, 
+    inds = varargin{1};
+  else
+    [inds, ok] = listdlg('ListString',sD.comp_names, 'PromptString',... 
+                         'Components', 'Name', 'Extract components', 'uh', 25);
+    if ~ok, return; end
+  end
+  if min(inds)<1 | max(inds)>dim, 
+    error('The component indeces must be within [1,dim]'); 
+  end
+ case 'extractsamp',
+  inds = varargin{1};
+  if min(inds)<1 | max(inds)>dlen, 
+    error('The sample indeces must be within [1,dlen]'); 
+  end
+ case 'movecomp',
+  inds = varargin{1};
+  indsto = varargin{2};
+  if min(inds)<1 | max(inds)>dim | min(indsto)<1 | max(indsto)>dim, 
+    error('The component indeces must be within [1,dim]'); 
+  end
+ case 'movesamp',
+  inds = varargin{1};
+  indsto = varargin{2};
+  if min(inds)<1 | max(inds)>dlen | min(indsto)<1 | max(indsto)>dlen, 
+    error('The sample indeces must be within [1,dlen]'); 
+  end
+ otherwise, 
+  error('Unrecognized action mode');
+end   
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% action
+
+switch action, 
+  case 'addcomp', 
+    if isstruct(D),       
+      sD.data = [sD.data, D.data]; 
+      sD.comp_names(dim+[1:d]) = D.comp_names; 
+      sD.comp_norm(dim+[1:d]) = D.comp_norm; 
+      sD = som_label(sD,'add',1:dlen,D.labels);
+    else
+      sD.data = [sD.data, D];
+      if isempty(cnames), 
+	for i=1:d, sD.comp_names(dim+i) = {sprintf('Variable%d',i+dim)}; end
+      else
+	sD.comp_names(dim+[1:d]) = cnames; 
+      end
+      for i=1:d, sD.comp_norm(dim+i) = {[]}; end
+    end
+    if ~isempty(indsto), 
+      sD = som_modify_dataset(sD,'movecomp',dim+[1:d],indsto);
+    end
+
+  case 'addsamp', 
+    if norm, D = som_normalize(D,sD); end
+    sD.data = [sD.data; D]; 
+    nl = size(sD.labels,2); 
+    sD.labels(dlen+[1:n],1:nl) = {''};
+    if ~isempty(lab), 
+      nl2 = size(lab,2); 
+      if nl2>nl, sD.labels(1:dlen,nl+[1:(nl2-nl)]) = {''}; end
+      sD.labels(dlen+[1:n],1:nl2) = lab; 
+    end
+    if ~isempty(indsto), 
+      sD = som_modify_dataset(sD,'movesamp',dlen+[1:n],indsto);
+    end
+
+  case 'removecomp', 
+    includeinds = 1:dim; 
+    includeinds(inds) = 0; 
+    sD = som_modify_dataset(sD,'extractcomp',find(includeinds));
+
+  case 'removesamp', 
+    includeinds = 1:dlen; 
+    includeinds(inds) = 0; 
+    sD = som_modify_dataset(sD,'extractsamp',find(includeinds));
+
+  case 'extractcomp', 
+    sD.data = sD.data(:,inds);
+    sD.comp_names = sD.comp_names(inds);
+    sD.comp_norm = sD.comp_norm(inds);    
+
+  case 'extractsamp', 
+    sD.data = sD.data(inds,:);
+    sD.labels = sD.labels(inds,:);
+
+  case 'movecomp', 
+    [indsto,order] = sort(indsto);
+    inds = inds(order);
+    oldinds = 1:dim; 
+    oldinds(inds) = 0; 
+    newinds = oldinds(oldinds>0);
+    for i=1:length(indsto),
+      ifrom = inds(i); ito = indsto(i);
+      if ito==1, newinds = [ifrom, newinds];
+      else newinds = [newinds(1:ito-1), ifrom, newinds(ito:end)];
+      end
+    end
+    sD.data = sD.data(:,newinds); 
+    sD.comp_names = sD.comp_names(:,newinds); 
+    sD.comp_norm = sD.comp_norm(:,newinds); 
+
+  case 'movesamp', 
+    [indsto,order] = sort(indsto);
+    inds = inds(order);
+    oldinds = 1:dim; 
+    oldinds(inds) = 0; 
+    newinds = oldinds(oldinds>0);
+    for i=1:length(indsto),
+      ifrom = inds(i); ito = indsto(i);
+      if ito==1, newinds = [ifrom, newinds];
+      else newinds = [newinds(1:ito-1), ifrom, newinds(ito:end)];
+      end
+    end
+    sD.data = sD.data(newinds,:);
+    sD.labels = sD.labels(newinds,:);
+
+end
+
+%som_set(sD);
+
+