我正在开发一个项目并且有许多要创建的函数,它们确实需要大量调试,所以我必须转到命令窗口并进行函数调用,而不是仅仅点击运行按钮。
MATLAB 是否支持像 python 那样为输入参数分配默认值?
在蟒蛇
def some_fcn(arg1 = a, arg2 = b)
% THE CODE
如果你现在在不传递参数的情况下调用它,它不会出错,但如果你在 MATLAB 中尝试同样的操作,它会出错。
我正在开发一个项目并且有许多要创建的函数,它们确实需要大量调试,所以我必须转到命令窗口并进行函数调用,而不是仅仅点击运行按钮。
MATLAB 是否支持像 python 那样为输入参数分配默认值?
在蟒蛇
def some_fcn(arg1 = a, arg2 = b)
% THE CODE
如果你现在在不传递参数的情况下调用它,它不会出错,但如果你在 MATLAB 中尝试同样的操作,它会出错。
对于分配默认值,如果使用exist
function 而不是nargin
.
function f(arg1, arg2, arg3)
if ~exist('arg2', 'var')
arg2 = arg2Default;
end
这样做的好处是,如果你改变了参数的顺序,你就不需要更新这部分代码,但是当你使用的时候nargin
你必须开始计数和更新数字。
如果您正在编写一个需要验证输入、默认参数值、键值对、将选项作为结构传递等的复杂函数,则可以使用该inputParser
对象。这个解决方案对于简单的函数来说可能是多余的,但是对于你的怪物函数,你可能会记住它,它可以解决方程、绘制结果并给你带来咖啡。它有点像你可以用 python 的argparse
模块做的事情。
你inputParser
像这样配置:
>> p = inputParser();
>> p.addRequired('x', @isfinite) % validation function
>> p.addOptional('y', 123) % default value
>> p.addParamValue('label', 'default') % default value
在函数内部,您通常会调用它p.parse(varargin{:})
并在p.Results
. 命令行上的一些快速演示:
>> p.parse(44); disp(p.Results)
label: 'default'
x: 44
y: 123
>> p.parse()
Not enough input arguments.
>> p.parse(Inf)
Argument 'x' failed validation isfinite.
>> p.parse(44, 55); disp(p.Results)
label: 'default'
x: 44
y: 55
>> p.parse(13, 'label', 'hello'); disp(p.Results)
label: 'hello'
x: 13
y: 123
>> p.parse(88, 13, 'option', 12)
Argument 'option' did not match any valid parameter of the parser.
你可以用nargin来做这件事
function out = some_fcn(arg1, arg2)
switch nargin
case 0
arg1 = a;
arg2 = b;
%//etc
end
但是a
从哪里来b
?它们是动态分配的吗?因为这会影响此解决方案的有效性
经过几秒钟的谷歌搜索后,我发现Loren Shure 已经为我们解决了这个问题。在这篇文章中,她准确地概述了我上面的方法,为什么它丑陋和糟糕,以及如何做得更好。
您可以nargin
在函数代码中使用来检测何时没有传递参数,并在这种情况下分配默认值或执行您想要的任何操作。
MathWorks 在 R2019b 中有一个新的解决方案,即arguments
块。当然,参数块有一些规则,因此我鼓励您通过查看函数参数验证帮助页面了解更多信息。这是一个简单的例子:
function ret = someFunction( x, y )
%SOMEFUNCTION Calculates some stuff.
arguments
x (1, :) double {mustBePositive}
y (2, 3) logical = true(2, 3)
end
% ...stuff is done, ret is defined, etc.
end
包裹进去的是narginchk
, inputParser
, validateattributes
,varargin
等,可以很方便。关于默认值,它们被非常简单地定义为等于某些东西的那些参数。在上面的例子中,x
is 没有赋值,而y = true(2, 3)
if 在调用函数时没有给出值。如果您还想x
拥有一个默认值,可以将其更改为x (1, :) double {mustBePositive} = 0.5 * ones(1, 4)
.
如何在 MATLAB 中处理函数参数的名称/值对 有一个更深入的答案,希望可以让您在熟悉新功能时免于头疼。