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;