VL_ARGPARSE解析参数值对的列表。OPTS = VL_ARGPARSE(OPTS,ARGS)基于指定的参数 - 值对ARGS = {PAR1,VAL1,… PARN,VALN}更新结构OPTS。如果参数PAR不能与OPTS中的任何字段匹配,则函数会生成错误。
在OPTS中具有struct值的参数以递归方式处理,更新各个子字段。可以通过使用VL_ARGPARSE(OPTS,ARGS,’nonrecursive’)抑制此行为,在这种情况下直接复制struct值(因此删除OPTS中存在的任何现有子字段)。 如果OPTS中的struct值是没有字段的结构,也会发生直接复制。当处理时间是关注时,非递归模式是特别有用的。
参数列表中的一个或多个(PAR,VAL)对可以是替换为结构; 在这种情况下,结构的字段用作参数名称,字段值用作参数值。 这种行为,虽然与结构值参数正交,也在“非递归”模式中禁用。
[OPTS,ARGS] = VL_ARGPARSE(OPTS,ARGS)将ARGS中与OPTS不匹配的任何参数复制回ARGS,而不是产生错误。 指定为结构的选项将作为(PAR,VAL)对的列表传回。
例:该函数可用于解析参数列表,传递给一个MATLAB函数:
function myFunction(x,y,z,varargin)
opts.parameterName = defaultValue ;
opts = vl_argparse(opts, varargin)
如果只解析一部分选项,例如,因为其他选项由子例程解释,然后使用形式
[opts, varargin] = vl_argparse(opts, varargin)
将任何未知参数复制回VARARGIN。
参见:VL_HELP()
if ~isstruct(opts) && ~isobject(opts), error('OPTS must be a structure') ; end %OPTS必须是一个结构体
if ~iscell(args), args = {args} ; end %iscell函数功能:判断给定数组是否是元胞数组.
recursive = true ;
if numel(varargin) == 1
if strcmp(lower(varargin{1}), 'nonrecursive') ; %strcmp函数功能:比较字符串s1和s2
recursive = false ;
else
error('Unknown option specified.') ; %未指定选项
end
end
if numel(varargin) > 1
error('There can be at most one option.') ; %最多只能有一个选项。
end
optNames = fieldnames(opts)' ; %fieldnames,获得结构数组opts的域名[matlab中结构体使用方法 - 学习记录 - 博客频道 - CSDN.NET](http://blog.csdn.net/littlestonelj/article/details/7564711)
%将ARGS转换为结构体
ai = 1 ;
keep = false(size(args)) ; %false()函数,生成逻辑0的矩阵,也就是“非”,false(m,n).
while ai <= numel(args) %args的元素总量大于等于1
% 检查参数是(param,value)对还是结构。
if recursive && isstruct(args{ai})
params = fieldnames(args{ai})' ;
values = struct2cell(args{ai})' ;
if nargout == 1
opts = vl_argparse(opts, vertcat(params,values)) ;
else
[opts, rest] = vl_argparse(opts, reshape(vertcat(params,values), 1, [])) ;
args{ai} = cell2struct(rest(2:2:end), rest(1:2:end), 2) ;
keep(ai) = true ;
end
ai = ai + 1 ;
continue ;
end
if ~isstr(args{ai})
error('Expected either a param-value pair or a structure.') ; %预期要么是参数值对,要么是结构
end
param = args{ai} ;
value = args{ai+1} ;
p = find(strcmpi(param, optNames)) ;
if numel(p) ~= 1
if nargout == 1
error('Unknown parameter ''%s''', param) ;
else
keep([ai,ai+1]) = true ;
ai = ai + 2 ;
continue ;
end
end
field = optNames{p} ;
if ~recursive
opts.(field) = value ;
else
if isstruct(opts.(field)) && numel(fieldnames(opts.(field))) > 0
%参数在OPTS中有一个非空的结构体值:
%递归进程
if ~isstruct(value)
error('Cannot assign a non-struct value to the struct parameter ''%s''.', field) ; %无法为结构参数字段分配非结构化值
end
if nargout > 1
[opts.(field), args{ai+1}] = vl_argparse(opts.(field), value) ;
else
opts.(field) = vl_argparse(opts.(field), value) ;
end
else
% 该参数在OPTS中没有结构值:copy as is。
opts.(field) = value ;
end
end
ai = ai + 2 ;
end
args = args(keep) ;