function [eid,emsg,varargout]=statgetargs(pnames,dflts,varargin) %STATGETARGS Process parameter name/value pairs for statistics functions % [EID,EMSG,A,B,...]=STATGETARGS(PNAMES,DFLTS,'NAME1',VAL1,'NAME2',VAL2,...) % accepts a cell array PNAMES of valid parameter names, a cell array % DFLTS of default values for the parameters named in PNAMES, and % additional parameter name/value pairs. Returns parameter values A,B,... % in the same order as the names in PNAMES. Outputs corresponding to % entries in PNAMES that are not specified in the name/value pairs are % set to the corresponding value from DFLTS. If nargout is equal to % length(PNAMES)+1, then unrecognized name/value pairs are an error. If % nargout is equal to length(PNAMES)+2, then all unrecognized name/value % pairs are returned in a single cell array following any other outputs. % % EID and EMSG are empty if the arguments are valid. If an error occurs, % EMSG is the text of an error message and EID is the final component % of an error message id. STATGETARGS does not actually throw any errors, % but rather returns EID and EMSG so that the caller may throw the error. % Outputs will be partially processed after an error occurs. % % This utility is used by some Statistics Toolbox functions to process % name/value pair arguments. % % Example: % pnames = {'color' 'linestyle', 'linewidth'} % dflts = { 'r' '_' '1'} % varargin = {{'linew' 2 'nonesuch' [1 2 3] 'linestyle' ':'} % [eid,emsg,c,ls,lw] = statgetargs(pnames,dflts,varargin{:}) % error % [eid,emsg,c,ls,lw,ur] = statgetargs(pnames,dflts,varargin{:}) % ok % Copyright 1993-2004 The MathWorks, Inc. % $Revision: 1.4.2.1 $ $Date: 2003/11/01 04:28:41 $ % We always create (nparams+2) outputs: % one each for emsg and eid % nparams varargs for values corresponding to names in pnames % If they ask for one more (nargout == nparams+3), it's for unrecognized % names/values % Initialize some variables emsg = ''; eid = ''; nparams = length(pnames); varargout = dflts; unrecog = {}; nargs = length(varargin); % Must have name/value pairs if mod(nargs,2)~=0 eid = 'WrongNumberArgs'; emsg = 'Wrong number of arguments.'; else % Process name/value pairs for j=1:2:nargs pname = varargin{j}; if ~ischar(pname) eid = 'BadParamName'; emsg = 'Parameter name must be text.'; break; end i = strmatch(lower(pname),pnames); if isempty(i) % if they've asked to get back unrecognized names/values, add this % one to the list if nargout > nparams+2 unrecog((end+1):(end+2)) = {varargin{j} varargin{j+1}}; % otherwise, it's an error else eid = 'BadParamName'; emsg = sprintf('Invalid parameter name: %s.',pname); break; end elseif length(i)>1 eid = 'BadParamName'; emsg = sprintf('Ambiguous parameter name: %s.',pname); break; else varargout{i} = varargin{j+1}; end end end varargout{nparams+1} = unrecog;