通过inputParser传递匿名函数(matlab)

时间:2016-04-08 10:18:44

标签: matlab parsing input

我第一次尝试使用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')。

我怀疑是一个简单的错误,但我无法弄明白。

1 个答案:

答案 0 :(得分:3)

使用addParameter方法(R2013b +,addParamValue之前)声明名称 - 值对。 addRequiredaddOptional没有与之关联的名称 - 值对,只需标识/记录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语义。