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

波变换

开发平台:

Matlab

  1. function [O,err] = wsfields(varargin)
  2. %WSFIELDS Set object or structure field contents.
  3. %
  4. %   O = WSFIELDS(O,'FieldName1',FieldValue1,'FieldName2',FieldValue2,...)
  5. %   sets 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 = WSFIELDS(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: 19-May-2003.
  15. %   Copyright 1995-2004 The MathWorks, Inc.
  16. %   $Revision: 1.6.4.2 $  $Date: 2004/03/15 22:43:30 $
  17. nbout = nargout;
  18. nbin  = nargin;
  19. if isobject(varargin{1})
  20.     depth = Inf;
  21.     i_obj = 1;
  22.     i_arg = 2;
  23. elseif isstruct(varargin{1})
  24.     depth = Inf;
  25.     i_obj = 1;
  26.     i_arg = 2;
  27. else
  28.     if ischar(varargin{1})
  29.         depth = Inf;
  30.     else
  31.         depth = varargin{1};
  32.     end
  33.     i_obj = 2;
  34.     i_arg = 3;
  35. end
  36. [O,okArg] = RecursSetFields(depth,varargin{i_obj},varargin{i_arg:nbin});
  37. err = (okArg==0);
  38. err = err(:)';
  39. idxERR = find(err);
  40. if ~isempty(idxERR)
  41.     idxERR = 2*idxERR-1+i_arg-1;
  42.     msg = strvcat('Unknown object field(s):',varargin{idxERR});
  43.     wwarndlg(msg,'Field Names ERROR ...','modal');
  44. end
  45. %----------------------------------------------------------------------------%
  46. % Internal Function(s)
  47. %----------------------------------------------------------------------------%
  48. function [O,okArg] = RecursSetFields(depth,obj,varargin)
  49. nbin   = nargin-2;
  50. nbinD2 = nbin/2;
  51. O = obj;
  52. if isobject(obj) , obj = struct(obj); end
  53. okArg = zeros(nbinD2,1);
  54. stFields = fieldnames(obj);
  55. nbFields = size(stFields,1);
  56. for k=1:2:nbin
  57.     vk = lower(varargin{k});
  58.     for j=1:nbFields
  59.        if isequal(vk,lower(stFields{j}))
  60.            [O,err] = OneFieldSetting(O,stFields{j},varargin{k+1});
  61.            if ~err , okArg((k+1)/2) = j; end
  62.            break
  63.        end
  64.     end
  65. end
  66. remArg = find(okArg==0);
  67. nbRem  = length(remArg);
  68. if nbRem>0
  69.     for j=1:nbFields
  70.        subSt = eval(['obj.' stFields{j}]);
  71.        continu = isobject(subSt) | (isstruct(subSt) & depth>0);
  72.        if continu
  73.            remArgTMP = [2*remArg-1,2*remArg];
  74.            remArgTMP = sort(remArgTMP(:)');
  75.            tmpargs = varargin(remArgTMP);
  76.            [subSt,tmpOk] = RecursSetFields(depth-1,subSt,tmpargs{:});
  77.            sumOK = sum(tmpOk);
  78.            if sumOK>0
  79.                [O,err] = OneFieldSetting(O,stFields{j},subSt);
  80.                if ~err
  81.                    okArg(remArg) = tmpOk;
  82.                    remArg = find(okArg==0);
  83.                    nbRem = length(remArg);
  84.                    if nbRem==0 , break; end
  85.                end
  86.            end
  87.        end
  88.     end
  89. end
  90. %----------------------------------------------------------------------------%
  91. function [O,err] = OneFieldSetting(O,fieldName,fieldValue)
  92. err = 0;
  93. if isobject(O)
  94.     try , O = set(O,fieldName,fieldValue); catch , err = 1; end
  95. elseif isstruct(O)
  96.    O.(fieldName) = fieldValue;
  97. else
  98.     error('Invalid field settings!');
  99. end
  100. %----------------------------------------------------------------------------%