我第一次尝试使用Matlab的inputParser,我不得不说我发现它有点令人困惑。我无法成功提供匿名函数作为可选参数。
这是我将参数传递给
的函数function myfun(str,bounds,varargin)
p = inputParser;
p.FunctionName = mfilename;
p.addRequired('str',@isstr);
p.addRequired('bounds',@isvector);
p.addOptional('str_latex','',@isstr);
p.addOptional('seed',[], @(x) isa(x,'function_handle'))
p.parse(str,bounds,varargin{:});
p.Results
% do something here
end
我这样称呼它......
myfun('str', 'epsilon',...
'str_latex', '\epsilon',...
'bounds', [0 1],...
'seed', @() betarnd(2,2))
但是我收到了一个错误:
使用我的乐趣时出错 'seed'的值无效。它必须满足函数:@(x)isa(x,'function_handle')。
我怀疑是一个简单的错误,但我无法弄明白。
答案 0 :(得分:3)
使用addParameter
方法(R2013b +,addParamValue
之前)声明名称 - 值对。 addRequired
和addOptional
没有与之关联的名称 - 值对,只需标识/记录argname
输入以供内部使用并与已解析的struct
关联。您似乎希望在此用例中使用所有addParamter
- 。
三种输入类型背后的主要思想是
根据我的经验,对于良好的,定义明确的函数,必需的参数几乎总是显而易见的,而Optional和Name-Value则更基于经验,复杂性和美学。一个简单的例子是linspace
:对于函数来说,间隔的开始和结束是绝对需要的,但不一定是默认情况下可以保留为100的点的数量,但给它一个明确的名称 - 值对有点矫枉过正。一个更复杂的例子是plot
函数:至少需要y
个数据,然后是x,y
个数据对,然后是x,y,linSpec
个数据集,然后是整数用于精确定制的特定名称 - 值对的列表,用户可以选择使用它。
将输入解析器写为,调用序列应为:
myfun('epsilon',[0,1],'\epsilon',@() betarnd(2,2));
由于没有声明名称 - 值对,因此不存在,但Optional参数仍然有positional order associated with them。您可以将解析器重新编写为:
function myfun(varargin)
p = inputParser;
p.FunctionName = mfilename;
p.addParameter('str',[],@isstr);
p.addParameter('bounds',[],@isvector);
p.addParameter('str_latex','',@isstr);
p.addParameter('seed',[], @(x) isa(x,'function_handle'))
p.parse(str, bounds, varargin{:});
p.Results
% do something here
end
对于像你可能期望的通用输入序列那样的东西。请注意,我使用[]
- s来使简单验证失败而没有良好的错误消息;你应该添加一条好的错误消息,指出这些名称 - 值对是正确功能所必需的,或者像你一样做,并且有addRequired
但没有名称的明确的,前期必需输入-value语义。