wtreemgr.m
上传用户:haiyisale
上传日期:2013-01-09
资源大小:3246k
文件大小:7k
源码类别:

波变换

开发平台:

Matlab

  1. function varargout = wtreemgr(opt,Ts,varargin)
  2. %WTREEMGR Manager for tree structure.
  3. %   VARARGOUT = WTREEMGR(OPT,TREE,VARARGIN)
  4. %   Allowed values for OPT and associated uses are 
  5. %   described in the functions listed in the See Also section:
  6. %
  7. %   'allnodes'  : All nodes.
  8. %   'isnode'    : Is node.
  9. %   'istnode'   : Lop "is terminal node".
  10. %   'create'    : Create a tree.
  11. %   'nodeasc'   : Node ascendants.
  12. %   'nodedesc'  : Node descendants.
  13. %   'nodepar'   : Node parent.
  14. %   'ntnode'    : Number of terminal nodes.
  15. %   'tnodes'    : Terminal nodes.
  16. %   'leaves'    : Terminal nodes.
  17. %   'noleaves'  : Not Terminal nodes.
  18. %   'order'     : Order of tree.
  19. %   'depth'     : Depth of tree.
  20. %
  21. %   For tree structure implementation see MAKETREE.
  22. %
  23. %   See also ALLNODES, ISNODE, ISTNODE, LEAVES, MAKETREE, 
  24. %   NODEASC, NODEDESC, NODEPAR, NOLEAVES, NTNODE, TNODES,
  25. %   TREEDPTH, TREEORD.
  26. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  27. %   Last Revision: 10-May-1999.
  28. %   Copyright 1995-2002 The MathWorks, Inc.
  29. %   $Revision: 1.12 $
  30. %Internal Options
  31. %----------------
  32. %   'replace'   : Replace.
  33. %   'change'    : Change.
  34. %   'restore'   : Restore.
  35. %   'rinfo'     : Read Info.
  36. %   'winfo'     : Write Info.
  37. %   'table'     : table of nodes fathers.
  38. %   'readall'   :
  39. %   out1 = Terminal Nodes (left ---> right)
  40. %   out2 = sizes of Terminal Nodes
  41. %   out3 = order
  42. %   out4 = depth
  43. % Check arguments.
  44. if errargn(mfilename,nargin,[2:5],nargout,[0:4]), error('*'); end
  45. if strcmp(opt,'create')
  46.     % [in3 in4 in5] = [order depth nbinfo]
  47.     % [out1 out2] = [Ts ntnode]
  48.     order = varargin{1};
  49.     nbtn  = order^varargin{2};
  50.     r     = varargin{3}+1;
  51.     c     = nbtn+1;
  52.     Ts    = zeros(r,c);
  53.     Ts(1,1:nbtn) = (nbtn-1)/(order-1):(order*nbtn-order)/(order-1);
  54.     Ts(1,c)      = -order;
  55.     varargout{1}   = Ts; varargout{2} = nbtn;
  56.     return
  57. end
  58. [rows,cols] = size(Ts);
  59. ntnode      = cols-1;
  60. if ntnode<1
  61.     errargt(mfilename,'Invalid tree structure!','msg');
  62.     error('*');
  63. end
  64. switch opt
  65.     case 'ntnode'
  66.         varargout{1} = ntnode;
  67.         return
  68.     case 'replace'
  69.         % in3 = insert in4,in5 = indices of replaced first, last
  70.         if nargin==3
  71.             varargout{1} = varargin{1};
  72.         else
  73.             varargout{1} = [Ts(:,1:varargin{2}-1) varargin{1} ...
  74.                         Ts(:,varargin{3}+1:cols)];
  75.         end
  76.         return
  77.     case 'change'
  78.         % in3 = new values in4 = indices of changed
  79.         if nargin==3
  80.             varargout{1} = varargin{1};
  81.         else
  82.             varargout{1} = Ts;
  83.             varargout{1}(:,varargin{2}) = varargin{1};
  84.         end
  85.         return
  86.     case 'restore'
  87.         % on trouve sur les tailles (ligne 2) 
  88.         % et pas sur les indices de noeuds (ligne 1)
  89.         %
  90.         preserve = [find(Ts(2,:)) cols];
  91.         varargout{1} = Ts(:,preserve);
  92.         return
  93.     case 'rinfo'
  94.         if rows>1
  95.             varargout{1} = Ts(2:rows,1:ntnode);
  96.         else
  97.             varargout{1} = [];
  98.         end
  99.         return
  100.         case 'winfo'
  101.             varargout{1}  = Ts;
  102.         if rows>1
  103.             varargout{1}(2:rows,1:ntnode) = varargin{1};
  104.         end
  105.         return
  106. end
  107. order = abs(Ts(1,cols));
  108. depth = floor(log(max(Ts(1,:))*(order-1)+1)/log(order));
  109. switch opt
  110.     case 'order'
  111.         varargout{1} = order;
  112.     case 'depth'
  113.         varargout{1} = depth;
  114.     case 'readall'
  115.         varargout{1} = Ts(1,1:ntnode)';
  116.         varargout{2} = Ts(2:rows,1:ntnode)';
  117.         varargout{3} = order;
  118.         varargout{4} = depth;      
  119.     case 'leaves'
  120.         tn = Ts(1,1:ntnode)';
  121.         K  = [1:length(tn)]';
  122.         if nargin>2
  123.             flagdps = varargin{1};
  124.             switch flagdps
  125.                 case {'s','sort'}
  126.                     [tn,K] = sort(tn); [nul,K] = sort(K);
  127.                 case {'sdp','dps','sortdp','dpsort'}
  128.                     [tn,K] = sort(tn); [nul,K] = sort(K);
  129.                     [tn(:,1),tn(:,2)] = ind2depo(order,tn);
  130.                 case {'dp'}
  131.                     [tn(:,1),tn(:,2)] = ind2depo(order,tn);
  132.             end
  133.         end
  134.         varargout{1} = tn; varargout{2} = K;
  135.     case 'tnodes'
  136.         [tn,K] = sort(Ts(1,1:ntnode)');
  137.         [nul,K]  = sort(K);
  138.         if nargin==3
  139.             [tn(:,1),tn(:,2)] = ind2depo(order,tn);
  140.         end
  141.         varargout{1} = tn; varargout{2} = K;
  142.     
  143.     case 'noleaves'
  144.          tmp = Ts(1,1:ntnode)';
  145.          if length(tmp)<=1, varargout{1} = []; return; end
  146.          nottn  = floor((tmp-1)/order);
  147.          for k = 1:depth
  148.              tmp  = floor((tmp-1)/order);
  149.              nottn = [nottn;tmp];
  150.          end
  151.          nottn = sort(nottn(find(nottn>=0)));
  152.          K    = [1;find(diff(nottn)~=0)+1];
  153.          nottn = nottn(K);
  154.          if nargin==3
  155.              [nottn(:,1),nottn(:,2)] = ind2depo(order,nottn);
  156.          end
  157.          varargout{1} = nottn;
  158.     case 'allnodes'
  159.         allN  = wtreemgr('tnodes',Ts);
  160.         if length(allN)<=1, varargout{1} = allN; return; end
  161.         tmp   = allN;
  162.         for k = 1:depth
  163.             tmp  = floor((tmp-1)/order);
  164.             allN = [allN;tmp];
  165.         end
  166.         allN = sort(allN(find(allN>=0)));
  167.         K    = [1;find(diff(allN)~=0)+1];
  168.         allN = allN(K);
  169.         if nargin==3
  170.             [allN(:,1),allN(:,2)] = ind2depo(order,allN);
  171.         end
  172.         varargout{1} = allN;
  173.     case 'isnode'
  174.         node  = depo2ind(order,varargin{1});
  175.         all   = wtreemgr('allnodes',Ts);
  176.         if prod(size(node))<=1
  177.             if find(all==node)
  178.                 varargout{1} = 1;
  179.             else
  180.                 varargout{1} = 0;
  181.             end
  182.         else
  183.             varargout{1} = ismember(node,all);
  184.         end
  185.     case 'istnode'
  186.         node  = depo2ind(order,varargin{1});
  187.         tn    = Ts(1,1:ntnode)';
  188.         varargout{1}  = zeros(size(node));
  189.         for k = 1:length(node)
  190.             in = find(node(k)==tn);
  191.             if ~isempty(in), varargout{1}(k) = in; end
  192.         end
  193.     case 'nodepar'
  194.         varargout{1}  = floor((depo2ind(order,varargin{1})-1)/order);
  195.         if nargin==4
  196.             [varargout{1}(:,1),varargout{1}(:,2)] = ind2depo(order,varargout{1});
  197.         end
  198.     case 'nodeasc'
  199.         asc   = depo2ind(order,varargin{1});
  200.         [d,p] = ind2depo(order,asc);
  201.         tmp   = asc;
  202.         for k = 1:d
  203.             tmp  = floor((tmp-1)/order);
  204.             asc = [asc;tmp];
  205.         end
  206.         if nargin==4
  207.             [asc(:,1),asc(:,2)] = ind2depo(order,asc);
  208.         end
  209.         varargout{1} = asc;
  210.     case 'nodedesc'
  211.         A     = wtreemgr('table',Ts);
  212.         node  = depo2ind(order,varargin{1});
  213.         [i,j] = find(A==node);
  214.         desc  = A(i,:);
  215.         desc  = desc(:);
  216.         desc  = sort(desc(find(desc>=node)));
  217.         if length(desc)>1
  218.             K = [1;find(diff(desc)~=0)+1];
  219.         else
  220.             K = 1;
  221.         end
  222.         desc = desc(K);
  223.         if nargin==4
  224.             [desc(:,1),desc(:,2)] = ind2depo(order,desc);
  225.         end
  226.         varargout{1} = desc;
  227.     case 'table'
  228.         [tn,K] = wtreemgr('tnodes',Ts);
  229.         if nargin==3, tn = tn(K); end
  230.         tab = zeros(length(tn),depth+1);
  231.         tab(:,1) = tn;
  232.         for j = 1:depth
  233.             tab(:,j+1) = floor((tab(:,j)-1)/order);
  234.         end
  235.         varargout{1} = tab;
  236.     otherwise
  237.         errargt(mfilename,'unknown option','msg'); error('*');
  238. end