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

波变换

开发平台:

Matlab

  1. function varargout = fmdtree(option,t,varargin)
  2. %FMDTREE Field manager for DTREE object.
  3. %   VARARGOUT = FMDTREE(OPT,T,VARARGIN)
  4. %
  5. %   For dtree object implementation see the
  6. %   Class Constructor DTREE.
  7. %
  8. % Utilities:
  9. %===========
  10. %   If T is the tree, I a column vector containing nodes indices
  11. %   C a vector containing columns indices and V a matrix which
  12. %   contains all-nodes infos:
  13. %
  14. %   V = FMDTREE('an_read',T) is equivalent to V = GET(T,'allNI')
  15. %   V = FMDTREE('an_read',T,I)
  16. %   V = FMDTREE('an_read',T,I,C)
  17. %   V = FMDTREE('an_read',T,'all',C)
  18. %
  19. %   T = FMDTREE('an_write',T,V) is equivalent to T = SET(T,'allNI',V)
  20. %   T = FMDTREE('an_write',T,V,'add')
  21. %   T = FMDTREE('an_write',T,V,I)
  22. %   T = FMDTREE('an_write',T,V,'add',C)
  23. %   T = FMDTREE('an_write',T,V,I,C)
  24. %
  25. %   T = FMDTREE('an_del',T,I) suppress all-nodes infos.
  26. %   I is a vector which contains nodes indices.
  27. %
  28. % INTERNAL OPTIONS:
  29. %===============================================================
  30. % OPT = 'setinit', set initial data.
  31. % OPT = 'getinit', get initial data.
  32. %---------------------------------------------------------------
  33. % allNI - All nodes Info: Array(nbnode,3+nbinfo_by_node)
  34. %   allNI(:,1)     = node index.
  35. %   allNI(:,2:3)   = size of node data.
  36. %   allNI(:,4:end) = depends of Class.
  37. %
  38. %   'an_del'   - all nodes infos: delete.
  39. %   'an_write' - all nodes infos: write.
  40. %   'an_read'  - all nodes infos: read.
  41. %---------------------------------------------------------------
  42. % terNI - Terminal nodes Info: CellArray(1,2)
  43. %   c{1} = Array(nbternod,2)  <--- sizes
  44. %   c{2} = Array(1,:)         <--- infos
  45. %
  46. %   'tn_beglensiz' - terminal nodes infos: begin-length-size.
  47. %   'tn_write'     - terminal nodes infos: write.
  48. %   'tn_read'      - terminal nodes infos: read.
  49. %===============================================================
  50. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 01-Jan-97.
  51. %   Last Revision: 21-May-2003.
  52. %   Copyright 1995-2004 The MathWorks, Inc.
  53. %   $Revision: 1.5.4.2 $  $Date: 2004/03/15 22:37:29 $
  54. nbin = length(varargin);
  55. switch option
  56.    %==========% BEG INIT %==========%
  57.     case 'setinit'
  58.       % nargin = 3
  59.       %    in3 = initial root data
  60.       %
  61.       % nargin = 4  EXPAND TREE
  62.       %    in3 = initial root info.
  63.       %    in4 = flag ('expand')
  64.       %------------------------------
  65.       order = treeord(t);
  66.       depth = treedpth(t);
  67.       switch order
  68.          case 0    , nbn = 0;
  69.          case 1    , nbn = depth;
  70.          otherwise , nbn = (order^(depth+1)-1)/(order-1);
  71.       end
  72.       if nargin<4
  73.           rootsize = size(varargin{1});
  74.           t.terNI = {rootsize , varargin{1}(:)'};
  75.           t.allNI = [[0:nbn-1]', [rootsize ; zeros(nbn-1,2)] ];
  76.       elseif ~isempty(varargin{1})
  77.           tmp = NaN*ones(nbn,length(varargin{1}));
  78.           tmp(1,:) = varargin{1};
  79.           t.allNI  = [t.allNI , tmp];
  80.       end
  81.       varargout{1} = t;
  82.     case 'getinit'
  83.       rootsize = t.terNI{1}(1,:);
  84.       varargout{1} = reshape(t.terNI{2},rootsize);
  85.    %==========% END INIT %==========%
  86.    %==========% BEG ALL NODES INFO %==========%
  87.     case 'an_del'
  88.       % in3 = node indices.
  89.       % out1 = new tree.
  90.       %--------------------
  91.       nodes = t.allNI(:,1);
  92.       idx = gidxsint(nodes,varargin{1});
  93.       t.allNI(idx,:) = [];
  94.       varargout{1} = t;
  95.     case 'an_write'
  96.       % nargin = 3
  97.       %    in3 = new value (first column = indices)
  98.       % nargin = 4
  99.       %    in3 = inserted value
  100.       %    if   in4 = 'add' , add value.
  101.       % nargin = 5
  102.       %    in3 = inserted value
  103.       %    in4 = nodes indices.
  104.       %    if   in4 = 'all' , all nodes.
  105.       %    in5 = columns.
  106.       % out1 = new tree
  107.       %---------------------------------------------
  108.       switch nargin
  109.           case 3
  110.               t.allNI = varargin{1};
  111.           case 4
  112.               if isequal(varargin{2},'add')
  113.                  t.allNI = [t.allNI;varargin{1}];
  114.               else
  115.                  i_nodes = gidxsint(t.allNI(:,1),varargin{2});
  116.                  t.allNI(i_nodes,:) = varargin{1};
  117.               end
  118.           case 5
  119.               if ischar(varargin{2})   % all nodes
  120.                  i_nodes = [1:size(t.allNI,1)]';
  121.               else
  122.                  i_nodes = gidxsint(t.allNI(:,1),varargin{2});
  123.               end
  124.               t.allNI(i_nodes,varargin{3}) = varargin{1};
  125.       end
  126.       varargout{1}  = t;
  127.     case 'an_read'
  128.       % if nargin = 2
  129.       %     reads all Tabinfos.
  130.       % if nargin = 3
  131.       %     in3 = nodes indices in tree structure.
  132.       % if nargin = 4
  133.       %     in3 = nodes indices in tree structure.
  134.       %     or
  135.       %     in3 = 'all' (all rows)
  136.       %     in4 = columns indices of allNI.
  137.       % out1 = infos (first column = indices)
  138.       %--------------------------------------------
  139.       switch nargin
  140.           case 2
  141.               varargout{1} = t.allNI;
  142.           case 3
  143.               i_nodes = gidxsint(t.allNI(:,1),varargin{1});
  144.               varargout{1} = t.allNI(i_nodes,:);
  145.           case 4
  146.               if ischar(varargin{1})   % all nodes
  147.                  i_nodes = [1:size(t.allNI,1)]';
  148.               else
  149.                  i_nodes = gidxsint(t.allNI(:,1),varargin{1});
  150.               end
  151.               varargout{1} = t.allNI(i_nodes,varargin{2});
  152.       end
  153.    %==========% END ALL NODES INFO %==========%
  154.    %==========% BEG TERMINAL NODES INFO %==========%
  155.     case 'tn_beglensiz'
  156.       % in3 = indice(s) in tree structure
  157.       %-----------------------------------
  158.       indices = varargin{1};
  159.       nb      = length(indices);
  160.       beg     = zeros(nb,1);
  161.       sizes   = t.terNI{1};
  162.       for k=1:nb
  163.           % attention prod([])=1
  164.           if indices(k) ~= 1
  165.               beg(k) = sum(prod(sizes(1:indices(k)-1,:),2));
  166.           end
  167.       end
  168.       varargout{1} = beg+1;
  169.       varargout{2} = prod(sizes(indices,:),2);
  170.       varargout{3} = sizes(indices,:);
  171.     case 'tn_write'
  172.       % nargin = 3
  173.       %    in3 = new data
  174.       % nargin = 4
  175.       %    in3 = new sizes
  176.       %    in4 = new data
  177.       % nargin = 5
  178.       %    in3 = replaced indice(s) in tree structure.
  179.       %      if len(in3)>1 , replace brother nodes...
  180.       %    in4 = inserted sizes.
  181.       %    in5 = inserted data.
  182.       % out1 = new tree
  183.       %-----------------------------------------------
  184.       switch nargin
  185.         case 3 , t.terNI = {size(varargin{1}),varargin{1}(:)'};
  186.         case 4 , t.terNI = {varargin{1},varargin{2}(:)'};
  187.         case 5
  188.           old = varargin{1};
  189.           nbr = length(old);
  190.           
  191.           % Compute begin and length.
  192.           sizes = t.terNI{1};
  193.           if old(1) ~= 1
  194.               beg = sum(prod(sizes(1:old(1)-1,:),2)) + 1;
  195.           else
  196.               beg = 1;
  197.           end
  198.           len = sum(prod(sizes(old,:),2));
  199.           
  200.           % Modification of sizes.
  201.           tmp = t.terNI{1};
  202.           tmp = [tmp(1:old(1)-1,:) ; varargin{2} ; tmp(old(nbr)+1:end,:)];
  203.           t.terNI{1} = tmp;
  204.           
  205.           % Modification of data.
  206.           tmp = t.terNI{2};
  207.           insertDATA = varargin{3}(:)';
  208.           tmp = [tmp(1,1:beg-1) , insertDATA , tmp(1,beg+len:end)];
  209.           t.terNI{2} = tmp;
  210.           
  211.       end
  212.       varargout{1} = t;
  213.     case 'tn_read'
  214.       % in3 = 'sizes'
  215.       %     out1 = matrix of sizes of terminal nodes data.
  216.       %     in4 = indices in tree structure (optional)
  217.       % in3 = 'databloc'
  218.       %     out1 = row vector containing compacted nodes data.
  219.       % in3 = 'data'
  220.       %     in4 = indices in tree structure
  221.       %     out1 = Cell Array containing nodes data
  222.       %------------------------------------------------------------
  223.       if nbin<1 , rmode = 'databloc'; else , rmode = varargin{1}; end
  224.       switch rmode
  225.           case 'sizes'
  226.               if nargin==3 | isequal(varargin{2},'all')
  227.                   varargout{1} = t.terNI{1};
  228.               else
  229.                   varargout{1} = t.terNI{1}(varargin{2},:);
  230.               end
  231.           case 'databloc'
  232.               varargout{1} = t.terNI{2};
  233.           case 'data'
  234.               sizes   = t.terNI{1};
  235.               cfs     = t.terNI{2};
  236.               indices = varargin{2};
  237.               nbnodes = length(indices);
  238.               sizDATA = sizes(indices,:);
  239.               beg     = zeros(nbnodes,1);
  240.               len     = prod(sizDATA,2);
  241.               for k=1:nbnodes
  242.                   % attention prod([])=1
  243.                   if indices(k) ~= 1
  244.                       beg(k) = sum(prod(sizes(1:indices(k)-1,:),2));
  245.                   end
  246.               end
  247.               beg = beg + 1;
  248.               lim = beg + len - 1;
  249.               for k=1:nbnodes
  250.                   if beg(k)<=lim(k)
  251.                       varargout{1}{k} = zeros(sizDATA(k,:));
  252.                       varargout{1}{k}(:) = cfs(beg(k):lim(k));
  253.                   else
  254.                       varargout{1}{k} = [];
  255.                   end
  256.               end
  257.       end
  258.    %==========% END TERMINAL NODES INFO %==========%
  259.    otherwise
  260.       error('Unknown option.'); 
  261. end