www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/wavelet/@dtree/fmdtree.m
function varargout = fmdtree(option,t,varargin) %FMDTREE Field manager for DTREE object. % VARARGOUT = FMDTREE(OPT,T,VARARGIN) % % For dtree object implementation see the % Class Constructor DTREE. % % Utilities: %=========== % If T is the tree, I a column vector containing nodes indices % C a vector containing columns indices and V a matrix which % contains all-nodes infos: % % V = FMDTREE('an_read',T) is equivalent to V = GET(T,'allNI') % V = FMDTREE('an_read',T,I) % V = FMDTREE('an_read',T,I,C) % V = FMDTREE('an_read',T,'all',C) % % T = FMDTREE('an_write',T,V) is equivalent to T = SET(T,'allNI',V) % T = FMDTREE('an_write',T,V,'add') % T = FMDTREE('an_write',T,V,I) % T = FMDTREE('an_write',T,V,'add',C) % T = FMDTREE('an_write',T,V,I,C) % % T = FMDTREE('an_del',T,I) suppress all-nodes infos. % I is a vector which contains nodes indices. % % INTERNAL OPTIONS: %=============================================================== % OPT = 'setinit', set initial data. % OPT = 'getinit', get initial data. %--------------------------------------------------------------- % allNI - All nodes Info: Array(nbnode,3+nbinfo_by_node) % allNI(:,1) = node index. % allNI(:,2:3) = size of node data. % allNI(:,4:end) = depends of Class. % % 'an_del' - all nodes infos: delete. % 'an_write' - all nodes infos: write. % 'an_read' - all nodes infos: read. %--------------------------------------------------------------- % terNI - Terminal nodes Info: CellArray(1,2) % c{1} = Array(nbternod,2) <--- sizes % c{2} = Array(1,:) <--- infos % % 'tn_beglensiz' - terminal nodes infos: begin-length-size. % 'tn_write' - terminal nodes infos: write. % 'tn_read' - terminal nodes infos: read. %=============================================================== % M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 01-Jan-97. % Last Revision: 06-Feb-2011. % Copyright 1995-2011 The MathWorks, Inc. nbin = length(varargin); switch option %==========% BEG INIT %==========% case 'setinit' % nargin = 3 % in3 = initial root data % % nargin = 4 EXPAND TREE % in3 = initial root info. % in4 = flag ('expand') %------------------------------ [order,depth] = get(t,'order','depth'); switch order case 0 , nbn = 0; case 1 , nbn = depth; otherwise , nbn = (order^(depth+1)-1)/(order-1); end if nargin<4 rootsize = size(varargin{1}); t.terNI = {rootsize , varargin{1}(:)'}; t.allNI = [(0:nbn-1)',[rootsize ; zeros(nbn-1,length(rootsize))]]; elseif ~isempty(varargin{1}) tmp = NaN*ones(nbn,length(varargin{1})); tmp(1,:) = varargin{1}; t.allNI = [t.allNI , tmp]; end varargout{1} = t; case 'getinit' rootsize = t.terNI{1}(1,:); varargout{1} = reshape(t.terNI{2},rootsize); %==========% END INIT %==========% %==========% BEG ALL NODES INFO %==========% case 'an_del' % in3 = node indices. % out1 = new tree. %-------------------- nodes = t.allNI(:,1); idx = gidxsint(nodes,varargin{1}); t.allNI(idx,:) = []; varargout{1} = t; case 'an_write' % nargin = 3 % in3 = new value (first column = indices) % nargin = 4 % in3 = inserted value % if in4 = 'add' , add value. % nargin = 5 % in3 = inserted value % in4 = nodes indices. % if in4 = 'all' , all nodes. % in5 = columns. % out1 = new tree %--------------------------------------------- switch nargin case 3 t.allNI = varargin{1}; case 4 if isequal(varargin{2},'add') t.allNI = [t.allNI;varargin{1}]; else i_nodes = gidxsint(t.allNI(:,1),varargin{2}); t.allNI(i_nodes,:) = varargin{1}; end case 5 if ischar(varargin{2}) % all nodes i_nodes = (1:size(t.allNI,1))'; else i_nodes = gidxsint(t.allNI(:,1),varargin{2}); end t.allNI(i_nodes,varargin{3}) = varargin{1}; end varargout{1} = t; case 'an_read' % if nargin = 2 % reads all Tabinfos. % if nargin = 3 % in3 = nodes indices in tree structure. % if nargin = 4 % in3 = nodes indices in tree structure. % or % in3 = 'all' (all rows) % in4 = columns indices of allNI. % out1 = infos (first column = indices) %-------------------------------------------- switch nargin case 2 varargout{1} = t.allNI; case 3 i_nodes = gidxsint(t.allNI(:,1),varargin{1}); varargout{1} = t.allNI(i_nodes,:); case 4 if ischar(varargin{1}) % all nodes i_nodes = (1:size(t.allNI,1))'; else i_nodes = gidxsint(t.allNI(:,1),varargin{1}); end varargout{1} = t.allNI(i_nodes,varargin{2}); end %==========% END ALL NODES INFO %==========% %==========% BEG TERMINAL NODES INFO %==========% case 'tn_beglensiz' % in3 = indice(s) in tree structure %----------------------------------- indices = varargin{1}; nb = length(indices); beg = zeros(nb,1); sizes = t.terNI{1}; for k=1:nb % attention prod([])=1 if indices(k) ~= 1 beg(k) = sum(prod(sizes(1:indices(k)-1,:),2)); end end varargout{1} = beg+1; varargout{2} = prod(sizes(indices,:),2); varargout{3} = sizes(indices,:); case 'tn_write' % nargin = 3 % in3 = new data % nargin = 4 % in3 = new sizes % in4 = new data % nargin = 5 % in3 = replaced indice(s) in tree structure. % if len(in3)>1 , replace brother nodes... % in4 = inserted sizes. % in5 = inserted data. % out1 = new tree %----------------------------------------------- switch nargin case 3 , t.terNI = {size(varargin{1}),varargin{1}(:)'}; case 4 , t.terNI = {varargin{1},varargin{2}(:)'}; case 5 old = varargin{1}; nbr = length(old); % Compute begin and length. sizes = t.terNI{1}; if old(1) ~= 1 beg = sum(prod(sizes(1:old(1)-1,:),2)) + 1; else beg = 1; end len = sum(prod(sizes(old,:),2)); % Modification of sizes. tmp = t.terNI{1}; tmp = [tmp(1:old(1)-1,:) ; varargin{2} ; tmp(old(nbr)+1:end,:)]; t.terNI{1} = tmp; % Modification of data. tmp = t.terNI{2}; insertDATA = varargin{3}(:)'; tmp = [tmp(1,1:beg-1) , insertDATA , tmp(1,beg+len:end)]; t.terNI{2} = tmp; end varargout{1} = t; case 'tn_read' % in3 = 'sizes' % out1 = matrix of sizes of terminal nodes data. % in4 = indices in tree structure (optional) % in3 = 'databloc' % out1 = row vector containing compacted nodes data. % in3 = 'data' % in4 = indices in tree structure % out1 = Cell Array containing nodes data %------------------------------------------------------------ if nbin<1 , rmode = 'databloc'; else rmode = varargin{1}; end switch rmode case 'sizes' if nargin==3 || isequal(varargin{2},'all') varargout{1} = t.terNI{1}; else varargout{1} = t.terNI{1}(varargin{2},:); end case 'databloc' varargout{1} = t.terNI{2}; case 'data' sizes = t.terNI{1}; cfs = t.terNI{2}; indices = varargin{2}; nbnodes = length(indices); sizDATA = sizes(indices,:); beg = zeros(nbnodes,1); len = prod(sizDATA,2); for k=1:nbnodes % attention prod([])=1 if indices(k) ~= 1 beg(k) = sum(prod(sizes(1:indices(k)-1,:),2)); end end beg = beg + 1; lim = beg + len - 1; for k=1:nbnodes if beg(k)<=lim(k) varargout{1}{k} = zeros(sizDATA(k,:)); varargout{1}{k}(:) = cfs(beg(k):lim(k)); else varargout{1}{k} = []; end end end %==========% END TERMINAL NODES INFO %==========% otherwise error(message('Wavelet:FunctionArgVal:Unknown_Opt')); end