【问题标题】:passing anonymous functions through inputParser (matlab)通过inputParser(matlab)传递匿名函数
【发布时间】:2016-04-08 10:18:44
【问题描述】:

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

但我得到一个错误:

使用我的乐趣时出错 “种子”的值无效。它必须满足函数:@(x)isa(x,'function_handle')。

我怀疑一个简单的错误,但我无法弄清楚。

【问题讨论】:

  • 一个不相关的问题是您将错误的输入传递给p.parse。由于您要传递 strbounds 及其属性名称,因此传递给 p.parsestrbounds 实际上是 'str' 和 'bounds'
  • 我不确定您何时选择了答案,但我为答案添加了更多解释和更多前进路径。

标签: matlab parsing input


【解决方案1】:

名称-值对使用addParameter 方法(之前的R2013b+、addParamValue)声明。 addRequiredaddOptional 没有与之关联的名称-值对,只是识别/记录 argname 输入以供内部使用并与已解析的 struct 关联。看来您想在此用例中使用所有 addParamter-s。


三种输入类型背后的主要思想是

  • 必需:第一个参数具有明确的、记录在案的输入名称,绝对需要用户提供,以便函数正确执行。
  • 可选:参数通常跟随必需参数,并带有明确的记录输入名称,通常由用户输入以实现自定义行为。
  • 名称-值:通常跟随可选参数的参数,其名称指定要设置的值通常由用户输入用于自定义行为,但不经常被给予预先明确的参数,如可选参数。

根据我的经验,对于良好、定义明确的函数,必需的参数几乎总是显而易见的,而 Optional 和 Name-Value 则更多地基于经验、复杂性和美学。一个简单的例子是linspace:间隔的开始和结束是绝对需要函数才能工作,但不一定是默认情况下可以保留为100的点数,而是给出它是一个显式的名称-值对有点矫枉过正。更复杂的例子是 plot 函数:至少需要 y 数据,然后是 x,y 数据对,然后是 x,y,linSpec 数据集,然后是特定名称-值对的完整列表精确定位用户可以选择使用的自定义。

使用您编写的输入解析器,调用顺序应该是:

myfun('epsilon',[0,1],'\epsilon',@() betarnd(2,2));

由于没有声明名称-值对,因此不存在,但可选参数仍然具有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 但没有名称-值语义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 2012-03-06
    • 1970-01-01
    • 2015-02-12
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多