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

波变换

开发平台:

Matlab

  1. function varargout = wgfields(varargin)
  2. %WGFIELDS Get object or structure field contents.
  3. %   [FieldValue1,FieldValue2, ...] = ...
  4. %       WGFIELDS(O,'FieldName1','FieldName2', ...) returns
  5. %   the contents of the specified fields for any object or
  6. %   structure O.
  7. %
  8. %   First, the search is done in O. If it fails, the
  9. %   subobjects and substructures fields are examined.
  10. %
  11. %   VARARGOUT = WGFIELDS(DEPTH,VARARGIN) with the integer DEPTH=>0,
  12. %   restricts the search at the depth DEPTH.
  13. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 03-Jun-97.
  14. %   Last Revision: 18-May-2003.
  15. %   Copyright 1995-2004 The MathWorks, Inc.
  16. %   $Revision: 1.6.4.2 $  $Date: 2004/03/15 22:42:56 $
  17. nbout = nargout;
  18. nbin  = nargin;
  19. tmpOut = cell(nbout,1);
  20. if isobject(varargin{1})
  21.     depth = Inf;
  22.     i_obj = 1;
  23.     i_arg = 2;
  24. elseif isstruct(varargin{1})
  25.     depth = Inf;
  26.     i_obj = 1;
  27.     i_arg = 2;
  28. else
  29.     if ischar(varargin{1})
  30.         depth = Inf;
  31.     else
  32.         depth = varargin{1};
  33.     end
  34.     i_obj = 2;
  35.     i_arg = 3;
  36. end
  37. [tmpOut,okArg] = RecursGetFields(depth,varargin{i_obj},varargin{i_arg:nbin});
  38. varargout = tmpOut;
  39. err = (okArg==0);
  40. err = err(:)';
  41. idxERR = find(err);
  42. if ~isempty(idxERR)
  43.     idxERR = idxERR+i_arg-1;
  44.     msg = strvcat('Unknown object field(s):',varargin{idxERR});
  45.     wwarndlg(msg,'Field Names ERROR ...','modal');
  46. end
  47. %----------------------------------------------------------------------------%
  48. % Internal Function(s)
  49. %----------------------------------------------------------------------------%
  50. function [tmpOut,okArg] = RecursGetFields(depth,obj,varargin)
  51. nbin = nargin-2;
  52. if isobject(obj) , obj = struct(obj); end
  53. if nbin>0
  54.     tmpOut = cell(nbin,1);
  55.     okArg  = zeros(nbin,1);
  56.     stFields = fieldnames(obj);
  57.     nbFields = size(stFields,1);
  58.     for k=1:nbin
  59.         vk = lower(varargin{k});
  60.         for j=1:nbFields
  61.             if isequal(vk,lower(stFields{j}))
  62.         okArg(k) = j;
  63.         break
  64.     end
  65.         end
  66.     end
  67.     tmp    = struct2cell(obj);
  68.     indOut = find(okArg);
  69.     tmpOut(indOut) = tmp(okArg(indOut));
  70.     remArg = find(okArg==0);
  71.     nbRem  = length(remArg);
  72.     if nbRem>0
  73.        for j=1:nbFields
  74.            subSt = obj.(stFields{j});
  75.            continu = isobject(subSt) | (isstruct(subSt) & depth>0);
  76.            if continu
  77.                tmpargs = varargin(remArg);
  78.                [tmpRem,tmpOk] = RecursGetFields(depth-1,subSt,tmpargs{:});
  79.                tmpOut(remArg) = tmpRem;
  80.                okArg(remArg)  = tmpOk;
  81.                remArg = find(okArg==0);
  82.                nbRem = length(remArg);
  83.                if nbRem==0 , break; end
  84.            end
  85.        end
  86.     end
  87. else
  88.     tmpOut = struct2cell(obj);
  89.     nbin   = length(tmpOut);
  90.     okArg  = [1:nbin];
  91. end