Mercurial > hg > ltpda
view m-toolbox/classes/+utils/@helper/collect_objects.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line source
% COLLECT_OBJECTS Collect objects of the required class. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DESCRIPTION: COLLECT_OBJECTS Collect objects of the required class. % % CALL: [objs, invars, rest] = collect_objects(varargin, class_type, in_names); % [objs, invars] = collect_objects(varargin, class_type, in_names); % [objs] = collect_objects(varargin, class_type, in_names); % [objs] = collect_objects(varargin, class_type); % [objs] = collect_objects(varargin, ''); % % INPUTS: varargin: Cell array of objects % class_name: Class name of the collected objects % If the class_name is empty then this function % collects all objects of the same class as % the first ltpda_object. % in_names: Cell array of corresponding variable names of % the contents in varargin % % OUTPUTS: objs: Collection of all required class objects. % invars: Collection of the object names of the corresponding object. % rest: Rest of all other objects collected in a cell array. % % VERSION: $Id: collect_objects.m,v 1.15 2011/04/19 16:24:36 ingo Exp $ % % HISTORY: 08-05-07 Diepholz % Creation % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function varargout = collect_objects(varargin, class_type, in_names) %%% collect input objects and corresponding variable names %%% If the class_type is empty then collect all objects of the first ltpda object if isempty(class_type) for ii = 1:length(varargin) if isa(varargin{ii}, 'ltpda_obj') class_type = class(varargin{ii}); break; end end end % Count the number of arguments that contain this class type Narg = length(varargin); classmatch = zeros(Narg,1); Nclass = 0; for ii=1:Narg if isa(varargin{ii}, class_type) classmatch(ii) = 1; Nclass = Nclass + 1; end end invars = {}; objs = []; other = {}; for ii=1:Narg vii = varargin{ii}; if classmatch(ii) if Nclass == 1 objs = vii; else if numel(vii) == 1 objs = [objs vii]; else objs = [objs reshape(vii, 1, [])]; end end %%% Define the variable name only if the input names are specified. if nargin == 3 && nargout > 1 % It is possible for a internal-call that in_names is empty % Create forthis an empty cell-array wit the size of varargin if isempty(in_names) in_names = cell(size(varargin)); end def_name = in_names{ii}; if isempty(def_name) def_name = 'unknown'; end % Memorise the variable name of the corresponding object. % If the object is an array or vector add the index to the variable name % % we choose the object name if it is not set to the default % and it's not empty. if (numel(vii) == 1) || (numel(vii) == 0) if classmatch(ii) try if ~strncmpi(vii.name, 'None', 4) if ~isempty(vii.name) def_name = vii.name; end end end end invars{end+1} = def_name; elseif classmatch(ii) if isa(vii, 'ltpda_uo') % Check the elements have all the same names sameNames = true; name = vii(1).name; for jj=2:numel(vii) if ~strcmp(name, vii(jj).name) sameNames = false; break; end end if sameNames if ~strcmpi(vii(1).name, 'None') && ~isempty(vii(1).name) def_name = vii(1).name; end Nargii = size(vii,1); for jj=1:numel(vii) invars{end+1} = mind2subStr(def_name, Nargii,jj); end else for jj=1:numel(vii) invars{end+1} = vii(jj).name; end end else % The objects don't have a 'name' Nargii = size(vii,1); for jj=1:numel(vii) invars{end+1} = mind2subStr(def_name, Nargii,jj); end end else invars{end+1} = def_name; end end else if nargout > 2 other{end+1} = vii; end end end % Collect outputs if nargout >= 1 varargout{1} = objs; end if nargout >= 2 varargout{2} = invars; end if nargout >= 3 varargout{3} = other; end end %-------------------------------------------------------- % A much simplified special case of ind2sub to collect just % the names. % function s = mind2subStr(name, siz, ndx) % Get J vi = rem(ndx-1, siz) + 1; J = (ndx-vi)/siz + 1; % Get I ndx = vi; vi = rem(ndx-1, 1) + 1; s = sprintf('%s(%d,%d)', name, (ndx - vi) + 1,J); end