MatConvNet代码梳理3--vl_argparse()

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) ;
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值