我编写了一个 Matlab R2020b 函数,可以选择接收三个输入 - 但如果未接收到输入,则应将它们设置为脚本中的默认值。
function my_opt_func(opt1, opt2, opt3)
if (~exist(opt1, 'var'))
opt1 = setopt1();
end
if (~exist(opt2, 'var'))
opt2 = setopt2();
end
if (~exist(opt3, 'var'))
opt3 = setopt3();
end
disp(string(opt1) + string(opt2) + string(opt3))
function opt1 = setopt1()
opt1 = 1;
end
function opt2 = setopt2()
opt2 = 2;
end
function opt3 = setopt3()
opt3 = 3;
end
end
这里,不同的
setopt
函数用于生成适当的默认值。
不幸的是,在不带参数的情况下调用此函数,如
my_opt_func
或 my_opt_func()
会给出错误 Not enough input arguments
。我尝试使用 varargin
的变体,但遇到了相同的错误。
当我在不使用
setopt
函数的情况下设置值时,我不会收到此错误 - 但由于我的实际程序的复杂性,我确实需要使用函数来开发我的默认值。
如何修复此错误,以便用户可以调用带有或不带有参数的函数 - 作为
my_opt_func()
或 my_opt_func(param1, param2, param3)
?
Cris 回答了您的直接问题在评论中,
exist
希望您输入变量的名称,而不是变量本身(因为它可能不存在!)
if (~exist('opt1', 'var')) % <- char 'opt1' is the variable name
opt1 = setopt1();
end
但无论如何,还有更好的方法可以做到这一点:
nargin
(n数量argumentsinput)。由于这直接取决于输入参数的数量,因此您不能执行诸如意外定义输入验证上方的变量并破坏流程之类的操作。调用函数的语法是相同的。function my_opt_func(opt1, opt2, opt3)
if nargin < 1
opt1 = setopt1();
end
if nargin < 2
opt2 = setopt2();
end
if nargin < 3
opt3 = setopt3();
end
...
addOptional
意味着您可以保持函数调用语法相同。或者,您可以使用输入解析器来处理“名称-值对”。我发现这通常是多余的,除非您想利用 inputParser
提供的其他功能。
function my_opt_func(varargin)
p = inputParser;
p.addOptional( 'opt1', setopt1() );
p.addOptional( 'opt2', setopt2() );
p.addOptional( 'opt3', setopt3() );
p.parse( varargin{:} );
opt1 = p.Results.opt1;
opt2 = p.Results.opt2;
opt3 = p.Results.opt3;
...