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

波变换

开发平台:

Matlab

  1. function [t,nbtn] = ntree(varargin)
  2. %NTREE Constructor for the class NTREE.
  3. %   T = NTREE(ORD,D) returns an NTREE object, which is
  4. %   a complete tree of order ORD and depth D.
  5. %
  6. %   T = NTREE is equivalent to T = NTREE(2,0).
  7. %   T = NTREE(ORD) is equivalent to T = NTREE(ORD,0).
  8. %
  9. %   With T = NTREE(ORD,D,S) you may set a "split scheme" 
  10. %   for nodes.
  11. %   The Split scheme S is an ORD by 1 logical array.
  12. %   The root of the tree may be split and it has ORD children.
  13. %   You may split the j-th child if S(j) = 1.
  14. %   Each node that you may split has the same property as
  15. %   the root node.
  16. %
  17. %   With T = NTREE(ORD,D,S,U) you may set a userdata field.
  18. %
  19. %   Another usage is:
  20. %   T = NTREE('order',ORD,'depth',D,'spsch',S,'ud',U).
  21. %   For "missing" inputs the defaults are:
  22. %        ORD = 2, D = 0, S = ones([1:ORD]), U = [] 
  23. %
  24. %   [T,NB] = NTREE(...) returns also the number of
  25. %   terminal nodes (leaves) of T.
  26. %
  27. %   The function NTREE returns a NTREE object.
  28. %   For more information on object fields, type: help ntree/get.  
  29. %
  30. %   See also WTBO.
  31. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 01-Oct-96.
  32. %   Last Revision: 22-May-2003.
  33. %   Copyright 1995-2004 The MathWorks, Inc.
  34. %   $Revision: 1.6.4.2 $  $Date: 2004/03/15 22:38:30 $
  35. %===============================================
  36. % Class NTREE (Parent objects: WTBO)
  37. % Fields:
  38. %   wtbo  - Parent object
  39. %   order - Tree order
  40. %   depth - Tree depth
  41. %   spsch - Split scheme for nodes
  42. %   tn    - Column Vector with terminal nodes indices
  43. %===============================================
  44. % Check arguments.
  45. nbIn = nargin;
  46. if nbIn > 8
  47.   error('Too many input arguments.');
  48. end
  49. % Defaults;
  50. order = 2;
  51. depth = 0;
  52. ud    = [];
  53. spsch = true(order,1);
  54. % Check.
  55. argNam = {'order','depth','spsch','ud'};
  56. argFlg = zeros(length(argNam),1);
  57. k = 1;
  58. while k<=nbIn
  59.    j = min(find(argFlg==0));
  60.    if isempty(j) , break; end  
  61.    if ischar(varargin{k}) && (j<5)
  62.        j = find(strcmp(argNam,varargin{k}));
  63.        if isempty(j)
  64.            if (argFlg(1:3)==[1 1 1]') && (k==nbIn)
  65.                j = 4; k = k-1;
  66.            else
  67.                msg = sprintf('Invalid argument name: %s', varargin{k});
  68.                error(msg);
  69.            end
  70.        end
  71.        k = k+1;
  72.    end
  73.    argFlg(j) = 1;
  74.    field = argNam{j};
  75.    eval([field ' = varargin{' sprintf('%0.f',k) '};'])    
  76.    k = k+1;    
  77. end
  78. if errargt(mfilename,order,'in0') | errargt(mfilename,depth,'in0')
  79.     error('Invalid values for order or depth.');
  80. elseif (order==0 && depth>0)
  81.     error('Invalid values for order or depth.');
  82. end
  83. if  order>0 , spDEF = true(order,1); else , spDEF = false; end
  84. try 
  85.   spsch = logical(spsch);
  86.   spsch = spsch(:);
  87.   if ~isequal(length(spsch),order) , spsch = spDEF; end 
  88. catch
  89.   spsch = spDEF;
  90. end
  91. % Built object.
  92. t = struct('order',order,'depth',depth,'spsch',spsch,'tn',0);
  93. [t.tn,nbtn] = getTN(order,depth,spsch);
  94. t = class(t,'ntree',wtbo(ud));
  95. t = set(t,'wtboInfo',class(t));
  96. %----------------------------------------------------------------------
  97. function [tn,nbtn] = getTN(order,depth,spsch)
  98. nbtn  = order^depth;
  99. switch order
  100.   case 0    , tn = 0;
  101.   case 1    , tn = depth;
  102.   otherwise , tn = [(nbtn-1)/(order-1):(order*nbtn-order)/(order-1)]';
  103. end
  104. if (order<2) | (depth<2) , return; end
  105. asc = zeros(nbtn,depth);
  106. asc(:,1) = tn;
  107. for j = 1:depth-1
  108.     asc(:,j+1) = floor((asc(:,j)-1)/order);
  109. end
  110. tab   = spsch(asc-order*floor((asc-1)/order));
  111. icol  = ones(nbtn,1);
  112. for ic=depth:-1:2
  113.     ir = find(icol<ic);
  114.     j  = find(tab(ir,ic)==0);
  115.     K  = ir(j);
  116.     icol(K) = ic;
  117.     tn(K)   = asc(K,ic);
  118. end
  119. tn = tn([1;1+find(diff(tn))]);
  120. nbtn = length(tn);
  121. %----------------------------------------------------------------------