Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过inputParser传递匿名函数(matlab)_Matlab_Parsing_Input - Fatal编程技术网

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

通过inputParser传递匿名函数(matlab),matlab,parsing,input,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','',@i

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


我怀疑有一个简单的错误,但我无法找出它。

名称-值对是使用该方法声明的(R2013b+,在此之前)。并且没有与之关联的名称-值对,只需识别/记录
argname
输入供内部使用,并与解析的
struct
关联。在这个用例中,您似乎想要使用所有的
addParameter
-s


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

  • Required:第一个参数带有明确的、有文档记录的输入名,用户必须提供这些输入名才能正确执行函数
  • 可选:参数通常跟在所需参数之后,带有显式的、有文档记录的输入名,这些输入名通常由用户为自定义行为输入
  • Name-Value:通常在可选参数后面的参数,其名称指定要设置的值,这些参数通常由用户输入,用于自定义行为,但不经常像可选参数那样预先提供显式参数
根据我的经验,对于好的、定义良好的函数,所需参数几乎总是显而易见的,而可选参数和名称值则更基于经验、复杂性和美学。一个简单的例子是
linspace
:函数工作绝对需要间隔的开始和结束,但不一定需要默认为100的点数,但给它一个显式的名称-值对有点过分。一个更复杂的例子是函数:至少需要
y
数据,然后是
x,y
数据对,然后是
x,y,linSpec
数据集,然后是一个特定名称-值对的完整列表,用于精确定制,用户可以选择使用

使用编写的输入解析器,调用序列应为:

myfun('epsilon',[0,1],'\epsilon',@() betarnd(2,2));
由于未声明名称-值对,因此不存在名称-值对,但可选参数仍有一个。您可以将解析器重新编写为:

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
提供明确的、预先需要的输入,但没有名称-值语义。

名称-值对是使用该方法声明的(R2013b+,在此之前)。并且没有与之关联的名称-值对,只需识别/记录
argname
输入供内部使用,并与解析的
struct
关联。在这个用例中,您似乎想要使用所有的
addParameter
-s


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

  • Required:第一个参数带有明确的、有文档记录的输入名,用户必须提供这些输入名才能正确执行函数
  • 可选:参数通常跟在所需参数之后,带有显式的、有文档记录的输入名,这些输入名通常由用户为自定义行为输入
  • Name-Value:通常在可选参数后面的参数,其名称指定要设置的值,这些参数通常由用户输入,用于自定义行为,但不经常像可选参数那样预先提供显式参数
根据我的经验,对于好的、定义良好的函数,所需参数几乎总是显而易见的,而可选参数和名称值则更基于经验、复杂性和美学。一个简单的例子是
linspace
:函数工作绝对需要间隔的开始和结束,但不一定需要默认为100的点数,但给它一个显式的名称-值对有点过分。一个更复杂的例子是函数:至少需要
y
数据,然后是
x,y
数据对,然后是
x,y,linSpec
数据集,然后是一个特定名称-值对的完整列表,用于精确定制,用户可以选择使用

使用编写的输入解析器,调用序列应为:

myfun('epsilon',[0,1],'\epsilon',@() betarnd(2,2));
由于未声明名称-值对,因此不存在名称-值对,但可选参数仍有一个。您可以将解析器重新编写为:

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
但没有名称-值语义的前端必需输入。

一个不相关的问题是,您将错误的输入传递到
p.parse
。由于您正在使用属性名传递
str
bounds
str
bounds
被传递到
p.parse
实际上是
'str
'bounds'
我不确定您选择答案时,但是我给答案添加了更多的解释和更多的前进路径。一个不相关的问题是,您将错误的输入传递给了
p.parse
。由于您正在使用属性名传递
str
bounds
str
bou