www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/wavelet/wsfields.m

    function [O,err] = wsfields(varargin)
%WSFIELDS Set object or structure field contents.
%
%   O = WSFIELDS(O,'FieldName1',FieldValue1,'FieldName2',FieldValue2,...)
%   sets the contents of the specified fields for any object or
%   structure O.
%
%   First, the search is done in O. If it fails, the
%   subobjects and substructures fields are examined.
%
%   VARARGOUT = WSFIELDS(DEPTH,VARARGIN) with the integer DEPTH=>0,
%   restricts the search at the depth DEPTH.

%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 03-Jun-97.
%   Last Revision 08-May-2012.
%   Copyright 1995-2012 The MathWorks, Inc.

nbin  = nargin;
if isobject(varargin{1})
    depth = Inf;
    i_obj = 1;
    i_arg = 2;

elseif isstruct(varargin{1})
    depth = Inf;
    i_obj = 1;
    i_arg = 2;

else
    if ischar(varargin{1})
        depth = Inf;
    else
        depth = varargin{1};		
    end
    i_obj = 2;
    i_arg = 3;
end
[O,okArg] = RecursSetFields(depth,varargin{i_obj},varargin{i_arg:nbin});
err = (okArg==0);
err = err(:)';
idxERR = find(err);
if ~isempty(idxERR)
    idxERR = 2*idxERR-1+i_arg-1;
    msg = {getWavMSG('Wavelet:moreMSGRF:Unknown_FIELD'),varargin{idxERR}};
    wwarndlg(msg,getWavMSG('Wavelet:moreMSGRF:ERR_Field_Names'),'modal');
end


%----------------------------------------------------------------------------%
% Internal Function(s)
%----------------------------------------------------------------------------%
function [O,okArg] = RecursSetFields(depth,obj,varargin)

nbin   = nargin-2;
nbinD2 = nbin/2;
O = obj;
if isobject(obj) , obj = struct(obj); end

okArg = zeros(nbinD2,1);
stFields = fieldnames(obj);
nbFields = size(stFields,1);
for k=1:2:nbin
    vk = lower(varargin{k});
    for j=1:nbFields
       if isequal(vk,lower(stFields{j}))
           [O,err] = OneFieldSetting(O,stFields{j},varargin{k+1});
           if ~err , okArg((k+1)/2) = j; end
           break
       end
    end
end
remArg = find(okArg==0);
nbRem  = length(remArg);
if nbRem>0
    for j=1:nbFields
       subSt = obj.(stFields{j});
       continu = isobject(subSt) | (isstruct(subSt) & depth>0);
       if continu
           remArgTMP = [2*remArg-1,2*remArg];
           remArgTMP = sort(remArgTMP(:));
           tmpargs = varargin(remArgTMP);
           [subSt,tmpOk] = RecursSetFields(depth-1,subSt,tmpargs{:});
           sumOK = sum(tmpOk);
           if sumOK>0
               [O,err] = OneFieldSetting(O,stFields{j},subSt);
               if ~err
                   okArg(remArg) = tmpOk;
                   remArg = find(okArg==0);
                   nbRem = length(remArg);
                   if nbRem==0 , break; end
               end
           end
       end
    end
end
%----------------------------------------------------------------------------%
function [O,err] = OneFieldSetting(O,fieldName,fieldValue)

err = 0;
if isobject(O)
    try
        O = set(O,fieldName,fieldValue);
    catch ME  %#ok<NASGU>
        err = 1;
    end
elseif isstruct(O)
   O.(fieldName) = fieldValue;
else
    error(message('Wavelet:FunctionArgVal:Invalid_FieldSet'));
end
%----------------------------------------------------------------------------%