www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/wavelet/@ntree/wtreemgr.m

    function varargout = wtreemgr(option,t,varargin)
%WTREEMGR NTREE object manager.
%   VARARGOUT = WTREEMGR(OPTION,T,VARARGIN)
%   Allowed values for OPTION and associated uses are
%   described in the functions listed in the See also section:
%
%   'order'    : Order of tree.
%   'depth'    : Depth of tree.
%   'leaves'   : Terminal nodes.
%   'tnodes'   : Terminal nodes.
%   'noleaves' : Not Terminal nodes.
%   'allnodes' : All nodes.
%   'isnode'   : Is node.
%   'istnode'  : Lop "is terminal node".
%   'nodeasc'  : Node ascendants.
%   'nodedesc' : Node descendants.
%   'nodepar'  : Node parent.
%   'ntnode'   : Number of terminal nodes.
%
%    See also ALLNODES, ISNODE, ISTNODE, LEAVES, NODEASC, NODEDESC,
%             NODEPAR, NOLEAVES, NTNODE, TNODES, TREEDPTH, TREEORD.

%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 01-Jan-97.
%   Last Revision: 06-Feb-2011.
%   Copyright 1995-2011 The MathWorks, Inc.

switch option
    case {'order','depth'} , varargout{1} = t.(option);
    
    case 'leaves' 
        order = t.order;
        tn  = t.tn;
        K = (1:length(tn))';
        if nargin>2
            flagdps = varargin{1};
            switch flagdps
                case {'s','sort'}
                  [tn,K] = sort(tn); [~,K] = sort(K);

                case {'sdp','dps','sortdp','dpsort'}
                  [tn,K] = sort(tn); [~,K] = sort(K);
                  [tn(:,1),tn(:,2)] = ind2depo(order,tn);

                case {'dp'}
                  [tn(:,1),tn(:,2)] = ind2depo(order,tn);
            end
        end
        varargout = {tn,K};
  
    case 'tnodes'
        if nargin==2 , outType = 'sort'; else outType = 'sortdp'; end
        [varargout{1},varargout{2}] = wtreemgr('leaves',t,outType);

    case 'noleaves'    
        if nargin==2 , flagdp = false; else flagdp = true; end 
        varargout{1} = descendants(t,0,'not_tn',flagdp);

    case 'allnodes'
        order = t.order;
        depth = t.depth;
        varargout{1}    = t.tn;
        if (length(varargout{1})==1) && (depth==0) , return; end
        if nargin==2 , flagdp = false; else flagdp = true; end
        varargout{1} = ascendants(varargout{1},order,depth,flagdp);
        
    case 'isnode'
        order = t.order;
        depth = t.depth;
        allN  = t.tn;
        if (depth~=0)
            flagdp = false;
            allN = ascendants(allN,order,depth,flagdp);
        end
        nodes = depo2ind(order,varargin{1});
        if numel(nodes)<=1
            if find(allN==nodes), varargout{1} = true;
            else varargout{1} = false;
            end
        else
            varargout{1} = ismember(nodes,allN);
        end

    case 'istnode'
        order = t.order;
        tn    = t.tn;
        nodes = depo2ind(order,varargin{1});
        [~,varargout{1}] = ismember(nodes,tn);

    case 'nodeasc'
        order = t.order;
        node  = depo2ind(order,varargin{1});
        d = ind2depo(order,node);
        if nargin==3 , flagdp = false; else flagdp = true; end
        varargout{1} = flipud(ascendants(node,order,d,flagdp));

    case 'nodedesc'
        if nargin==3 , flagdp = false; else flagdp = true; end
        varargout{1} = descendants(t,varargin{1},'all',flagdp);

    case 'nodepar'
        order = t.order;
        node  = depo2ind(order,varargin{1});
        par   = floor((node-1)/order);
        if nargin==4 , [par(:,1),par(:,2)] = ind2depo(order,par); end
        varargout{1} = par; 

    case 'ntnode'
        tn = t.tn';
        varargout{1} = length(tn);

    otherwise
        error(message('Wavelet:FunctionArgVal:Unknown_Opt'));
end