通过inputParser传递匿名函数(matlab)
我第一次尝试使用Matlab的inputParser,我不得不说我发现它有点混乱。我无法成功地将匿名函数作为可选参数提供 这就是我要传递参数的函数通过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
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