Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_clget.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_clget.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,115 @@ +function a = som_clget(sC, mode, ind) + +%SOM_CLGET Get properties of specified clusters. +% +% a = som_clget(sC, mode, ind) +% +% inds = som_clget(sC,'dinds',20); +% col = som_clget(sC,'depth',[1 2 3 20 54]); +% +% Input and output arguments: +% sC (struct) clustering struct +% mode (string) what kind of property is requested +% 'binds' (a union over) indeces of base clusters +% belonging to the specified cluster(s) +% 'dinds' (a union over) indeces of the data vectors +% belonging to the specified cluster(s) +% 'dlen' number of data vectors belonging +% to each of the specified cluster(s) +% 'depth' depths of the specified clusters +% (depth of the root cluster is 0, +% depth of its children are 1, etc.) +% 'child' (a union over) children clusters +% of specified cluster(s), including +% the clusters themselves +% 'base' base partitioning based on given +% clusters +% ind (vector) indeces of the clusters +% +% a (vector) the answer +% +% See also SOM_CLSTRUCT, SOM_CLPLOT. + +% Copyright (c) 2000 by the SOM toolbox programming team. +% Contributed to SOM Toolbox on XXX by Juha Vesanto +% http://www.cis.hut.fi/projects/somtoolbox/ + +% Version 2.0beta juuso 180800 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clen = size(sC.tree,1)+1; + +switch mode, + case 'binds', + a = []; + for i=1:length(ind), a = [a, getbaseinds(sC.tree,ind(i))]; end + a = unique(a); + case 'dinds', + b = []; + for i=1:length(ind), b = [b, getbaseinds(sC.tree,ind(i))]; end + b = unique(b); + a = zeros(length(sC.base),1); + for i=1:length(b), a(find(sC.base==b(i)))=1; end + a = find(a); + case 'dlen', + a = zeros(length(ind),1); + for i=1:length(ind), + b = getbaseinds(sC.tree,ind(i)); + for j=1:length(b), a(i) = a(i) + sum(sC.base==b(j)); end + end + case 'depth', + a = getdepth(sC.tree); + a = a(ind); + case 'child', + a = getchildren(sC.tree,ind); + case 'base', + a = sC.base*0; + ind = -sort(-ind); + for i=1:length(ind), a(som_clget(sC,'dinds',ind(i))) = ind(i); end +end + +return; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function ch = getchildren(Z,ind) + + clen = size(Z,1)+1; + ch = ind; cho = ind; + while any(cho), + i = cho(1); cho = cho(2:end); + j = Z(i-clen,1); k = Z(i-clen,2); + if j>clen, cho(end+1) = j; end + if k>clen, cho(end+1) = k; end + ch(end+1) = j; ch(end+1) = k; + end + return; + +function binds = getbaseinds(Z,ind) + + clen = size(Z,1)+1; + binds = ind; + while binds(1)>clen, + i = binds(1); + binds = binds(2:end); + j = Z(i-clen,1); k = Z(i-clen,2); + if j>clen, binds = [j binds]; else binds(end+1) = j; end + if k>clen, binds = [k binds]; else binds(end+1) = k; end + end + return; + +function depth = getdepth(Z) + + clen = size(Z,1)+1; + depth = zeros(2*clen-1,1); + ch = 2*clen-1; % active nodes + while any(ch), + c = ch(1); ch = ch(2:end); + if c>clen & isfinite(Z(c-clen,3)), + chc = Z(c-clen,1:2); % children of c + depth(chc) = depth(c) + 1; % or +(ind==chc(1)) + ch = [ch, chc]; + end + end + return;