Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_label.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_label.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,283 @@ +function [sTo] = som_label(sTo, mode, inds, labels) + +%SOM_LABEL Give/clear labels to/from map or data struct. +% +% sTo = som_label(sTo, mode, inds [, labels]) +% +% sD = som_label(sD,'add',20,'a_label'); +% sM = som_label(sM,'replace',[2 4],'a_label'); +% sM = som_label(sM,'add',som_bmus(sM,x),'BMU'); +% sD = som_label(sD,'prune',[1:10]'); +% sM = som_label(sM,'clear','all'); +% +% Input and output arguments ([]'s are optional): +% sTo (struct) data or map struct to which the labels are put +% mode (string) 'add' or 'replace' or 'prune' or 'clear' +% inds (vector) indeces of the vectors to which the labels +% are put. Note: this must be a column vector! +% (matrix) subscript indeces to the '.labels' field. The vector +% is given by the first index (e.g. inds(i,1)). +% (string) for 'prune' and 'clear' modes, the string 'all' +% means that all vectors should be pruned/cleared +% [labels] The labels themselves. The number of rows much match +% the number of given indeces, except if there is either +% only one index or only one label. If mode is +% 'prune' or 'clear', labels argument is ignored. +% (string) Label. +% (string array) Each row is a label. +% (cell array of strings) All labels in a cell are handled +% as a group and are applied to the same vector given +% on the corresponding row of inds. +% +% Note: If there is only one label/index, it is used for each specified +% index/label. +% +% For more help, try 'type som_label' or check out online documentation. +% See also SOM_AUTOLABEL, SOM_SHOW_ADD, SOM_SHOW. + +%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% som_label +% +% PURPOSE +% +% Add (or remove) labels to (from) map and data structs. +% +% SYNTAX +% +% sTo = som_label(sTo, 'clear', inds) +% sTo = som_label(sTo, 'prune', inds) +% sTo = som_label(sTo, 'add', inds, labels) +% sTo = som_label(sTo, 'replace', inds, labels) +% +% DESCRIPTION +% +% This function can be used to give and remove labels in map and data +% structs. Of course the same operation could be done by hand, but this +% function offers an alternative and hopefully slightly user-friendlier +% way to do it. +% +% REQUIRED INPUT ARGUMENTS +% +% sTo (struct) data or map struct to which the labels are put +% mode (string) The mode of operation. +% 'add' : adds the given labels +% 'clear' : removes labels +% 'replace' : replaces current labels with given +% labels; basically same as 'clear' +% followed by 'add' +% 'prune' : removes empty labels ('') from between +% non-empty labels, e.g. if the labels of +% a vector were {'A','','','B','','C'} +% they'd become {'A','B','C'}. Some empty +% labels may be left at the end of the list. +% +% inds Identifies the vectors to which the operation +% (given by mode) is applied to. +% (vector) Linear indexes of the vectors, size n x 1. +% Notice! This should be a column vector! +% (matrix) The labels are in a cell matrix. By giving matrix +% argument for inds, you can address this matrix +% directly. The first index gives the vector and the +% second index the vertical position of the label in +% the labels array. Size n x 2, where n is the +% number of labels. +% (string) for 'prune' and 'clear' modes, the string 'all' +% means that all vectors should be pruned/cleared +% +% OPTIONAL INPUT ARGUMENTS +% +% [labels] The labels themselves. The number of rows much match +% the number of given indeces, except if there is either +% only one index or only one label. +% (string) Label, e.g. 'label' +% (string array) Each row is a label, +% e.g. ['label1'; 'label2'; 'label3'] +% (cell array of strings) All labels in a cell are handled +% as a group and are applied to the same vector given +% on the corresponding row of inds. +% e.g. three labels: {'label1'; 'label2'; 'label3'} +% e.g. a group of labels: {'label1', 'label2', 'label3'} +% e.g. three groups: {{'la1'},{'la21','la22'},{'la3'} +% +% OUTPUT ARGUMENTS +% +% sTo (struct) the given data/map struct with modified labels +% +% EXAMPLES +% +% This is the basic way to add a label to map structure: +% sMap = som_label(sMap,'add',3,'label'); +% +% The following examples have identical results: +% sMap = som_label(sMap,'add',[4; 13], ['label1'; 'label2']); +% sMap = som_label(sMap,'add',[4; 13], {{'label1'};{'label2'}}); +% +% Labeling the BMU of a vector x (and removing any old labels) +% sMap = som_label(sMap,'replace',som_bmus(sMap,x),'BMU'); +% +% Pruning labels +% sMap = som_label(sMap,'prune','all'); +% +% Clearing labels from a struct +% sMap = som_label(sMap,'clear','all'); +% sMap = som_label(sMap,'clear',[1:4, 9:30]'); +% +% SEE ALSO +% +% som_autolabel Automatically label a map/data set. +% som_show Show map planes. +% som_show_add Add for example labels to the SOM_SHOW visualization. + +% Copyright (c) 1997-2000 by the SOM toolbox programming team. +% http://www.cis.hut.fi/projects/somtoolbox/ + +% Version 2.0beta juuso 101199 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% check arguments + +error(nargchk(3, 4, nargin)); % check no. of input args is correct + +% sTo +switch sTo.type, +case 'som_map', [dlen dim] = size(sTo.codebook); +case 'som_data', [dlen dim] = size(sTo.data); +end +maxl = size(sTo.labels,2); % maximum number of labels for a single vector + +% inds +if ischar(inds) & strcmp(inds,'all'), + inds = [1:dlen]'; +end +if length(inds)>2 & size(inds,2)>2, inds = inds'; end +ni = size(inds,1); +n = ni; + +% labels +if nargin==4, + % convert labels to a cell array of cells + if ischar(labels), labels = cellstr(labels); end + if iscellstr(labels), + tmplab = labels; + nl = size(labels,1); + labels = cell(nl,1); + for i=1:nl, + if ~iscell(tmplab{i}) + if ~isempty(tmplab{i}), labels{i} = tmplab(i,:); + else labels{i} = {}; end + else + labels(i) = tmplab(i); + end + end + clear tmplab; + end + nl = size(labels,1); +end + +% the case of a single label/index +if any(strcmp(mode,{'add','replace'})), + n = max(nl,ni); + if n>1, + if ni==1, + inds = zeros(n,1)+inds(1); + elseif nl==1, + label = labels{1}; + labels = cell(n,1); + for i=1:n, labels{i} = label; end + elseif ni ~= nl, + error('The number of labels and indexes does not match.'); + end + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% action + +switch mode, + case 'clear', + if size(inds,2)>2, + inds = inds(find(inds(:,2)<=maxl),:); % ignore if subindex is out-of-range + inds = sub2ind([dlen maxl],inds(:,1),inds(:,2)); + sTo.labels{inds} = []; + else + sTo.labels(inds,:) = cell(n,maxl); + end + case 'prune', + if size(inds,2)==1, + % subindex gives the index from which the pruning is started + inds = [inds, ones(n,1)]; % from 1 by default + end + select = ones(1,maxl); + for i=1:n, + v = inds(i,1); s = inds(i,2); select(:) = 1; + for j=s:maxl, select(j) = ~isempty(sTo.labels{v,j}); end + if ~all(select), + labs = cell(1,maxl); + labs(1:sum(select)) = sTo.labels(v,find(select)); + sTo.labels(v,:) = labs; + end + end + case 'add', + if size(inds,2)==1, + % subindex gives the index from which the adding is started + inds = [inds, ones(n,1)]; % from 1 by default + end + for i=1:n, + v = inds(i,1); s = inds(i,2); l = length(labels{i}); + for j=1:l, + while s<=size(sTo.labels,2) & ~isempty(sTo.labels{v,s}), s=s+1; end + sTo.labels{v,s} = labels{i}{j}; + s=s+1; + end + end + case 'replace', + if size(inds,2)==1, + % subindex gives the index from which the replacing is started + inds = [inds, ones(n,1)]; % from 1 by default + end + for i=1:n, + v = inds(i,1); s = inds(i,2); l = length(labels(i)); + for j=1:l, sTo.labels{v,s-1+j} = labels{i}{j}; end + end + otherwise + error(['Unrecognized mode: ' mode]); +end + +sTo.labels = remove_empty_columns(sTo.labels); + +[dlen maxl] = size(sTo.labels); +for i=1:dlen, + for j=1:maxl, + if isempty(sTo.labels{i,j}) & ~ischar(sTo.labels{i,j}), + sTo.labels{i,j} = ''; + end + end +end + +return; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% subfunctions + +function labels = remove_empty_columns(labels) + + [dlen maxl] = size(labels); + + % find which columns are empty + cols = zeros(1,maxl); + for i=1:dlen, + for j=1:maxl, + cols(j) = cols(j) + ~isempty(labels{i,j}); + end + end + while maxl>0 & cols(maxl)==0, maxl = maxl-1; end % check starting from end + + if maxl==0, labels = cell(dlen,1); + elseif maxl<size(labels,2), labels = labels(:,1:maxl); + else % ok + end + % end of remove_empty_columns + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%