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

波变换

开发平台:

Matlab

  1. function [t,x,rec] = nodejoin(t,nodes)
  2. %NODEJOIN Recompose node.
  3. %   T = NODEJOIN(T,N) returns the modified tree T
  4. %   corresponding to a recomposition of the node N.
  5. %
  6. %   The nodes are numbered from left to right and
  7. %   from top to bottom. The root index is 0.
  8. %
  9. %   T = NODEJOIN(T) is equivalent to T = NODEJOIN(T,0).
  10. %
  11. %   This method overloads the NTREE method and 
  12. %   calls the right overloaded method MERGE.
  13. %
  14. %   See also MERGE, NODESPLT.
  15. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 15-Oct-96.
  16. %   Last Revision: 23-May-2003.
  17. %   Copyright 1995-2004 The MathWorks, Inc.
  18. %   $Revision: 1.4.4.2 $  $Date: 2004/03/15 22:37:31 $
  19. if nargin == 1, nodes = 0; end
  20. x   = [];
  21. rec = [];
  22. order = treeord(t);
  23. nodes = depo2ind(order,nodes);
  24. nbNodes = length(nodes);
  25. for idx = 1:nbNodes
  26.     N = nodes(idx);
  27.     tn = leaves(t);
  28.     n_rank = tnRANK(tn,N);
  29.     if n_rank>0
  30.         x = getNodeDATA(t,n_rank);
  31.     else
  32.         t_copy = t.ntree;
  33.         [tmp,rec] = nodejoin(t_copy,N);
  34.         nbREC = length(rec);
  35.         elim = zeros(order,nbREC);
  36.         for k=1:nbREC
  37.             N = rec(k);
  38.             i_child = N*order + [1:order]';
  39.             elim(:,k) = i_child;
  40.             
  41.             tn = leaves(t_copy);
  42.             n_rank  = zeros(order,1);
  43.             for jj = 1:order
  44.                 n_rank(jj) = tnRANK(tn,i_child(jj));
  45.             end 
  46.             t_copy = nodejoin(t_copy,N);
  47.             
  48.             % Modify: terNI - Terminal Nodes Information (DATA).
  49.             [t,x] = modififyDATA(t,N,n_rank);
  50.         end
  51.         
  52.         % Modify: allNI - All Nodes Information.
  53.         allN = t.allNI(:,1);
  54.         idx = gidxsint(allN,elim(:));
  55.         t.allNI(idx,:) = [];
  56.         
  57.         % Modify: Parent Object.
  58.         t.ntree = t_copy;
  59.     end
  60. end
  61. %----------------------------------------------------------------------
  62. function n_rank = tnRANK(tn,n)
  63. n_rank = find(n==tn);
  64. if isempty(n_rank)
  65.     n_rank = 0;
  66. end
  67. %----------------------------------------------------------------------
  68. function x = getNodeDATA(t,n_rank)
  69. sizes   = t.terNI{1};
  70. cfs     = t.terNI{2};
  71. nbnodes = length(n_rank);
  72. sizDATA = sizes(n_rank,:);
  73. len     = prod(sizDATA,2);
  74. if n_rank ~= 1
  75.     beg = sum(prod(sizes(1:n_rank-1,:),2)) + 1;
  76. else
  77.     beg = 1;
  78. end
  79. lim = beg + len - 1;
  80. if beg <= lim
  81.     x = zeros(sizDATA);
  82.     x(:) = cfs(beg:lim);
  83. else
  84.     x = [];
  85. end
  86. %----------------------------------------------------------------------
  87. function [t,x] = modififyDATA(t,N,n_rank)
  88. sizes   = t.terNI{1};
  89. cfs     = t.terNI{2};
  90. nbnodes = length(n_rank);    % nbnodes = order
  91. sizDATA = sizes(n_rank,:);
  92. beg     = zeros(nbnodes,1);
  93. len     = prod(sizDATA,2);
  94. for k=1:nbnodes
  95.     % attention prod([])=1
  96.     if n_rank(k) ~= 1
  97.         beg(k) = sum(prod(sizes(1:n_rank(k)-1,:),2));
  98.     end
  99. end
  100. beg = beg + 1;
  101. lim = beg + len - 1;
  102. for k=1:nbnodes
  103.     if beg(k)<=lim(k)
  104.         tndata{k}    = zeros(sizDATA(k,:));
  105.         tndata{k}(:) = cfs(beg(k):lim(k));
  106.     else
  107.         tndata{k} = [];
  108.     end
  109. end
  110. x = merge(t,N,tndata);
  111. % Compute begin and length of insert DATA.
  112. beg = beg(1);
  113. len = sum(len);
  114. % Modification of sizes.
  115. tmp = t.terNI{1};
  116. tmp = [tmp(1:n_rank(1)-1,:) ; size(x) ; tmp(n_rank(nbnodes)+1:end,:)];
  117. t.terNI{1} = tmp;
  118. % Modification of data.
  119. tmp = t.terNI{2};
  120. insertDATA = x(:)';
  121. tmp = [tmp(1,1:beg-1) , insertDATA , tmp(1,beg+len:end)];
  122. t.terNI{2} = tmp;
  123. %----------------------------------------------------------------------