7

我正在开发一个项目并且有许多要创建的函数,它们确实需要大量调试,所以我必须转到命令窗口并进行函数调用,而不是仅仅点击运行按钮。

MATLAB 是否支持像 python 那样为输入参数分配默认值?

在蟒蛇

def some_fcn(arg1 = a, arg2 = b)
% THE CODE

如果你现在在不传递参数的情况下调用它,它不会出错,但如果你在 MATLAB 中尝试同样的操作,它会出错。

4

5 回答 5

13

对于分配默认值,如果使用existfunction 而不是nargin.

function f(arg1, arg2, arg3)
if ~exist('arg2', 'var')
    arg2 = arg2Default;
end

这样做的好处是,如果你改变了参数的顺序,你就不需要更新这部分代码,但是当你使用的时候nargin你必须开始计数和更新数字。

于 2013-09-20T14:32:39.157 回答
7

如果您正在编写一个需要验证输入、默认参数值、键值对、将选项作为结构传递等的复杂函数,则可以使用该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.
于 2013-09-20T14:00:01.100 回答
5

你可以用nargin来做这件事

function out = some_fcn(arg1, arg2)
    switch nargin
       case 0
             arg1 = a;
             arg2 = b;
    %//etc
end

但是a从哪里来b?它们是动态分配的吗?因为这会影响此解决方案的有效性

经过几秒钟的谷歌搜索后,我发现Loren Shure 已经为我们解决了这个问题。在这篇文章中,她准确地概述了我上面的方法,为什么它丑陋和糟糕,以及如何做得更好。

于 2013-09-20T13:43:34.600 回答
0

您可以nargin在函数代码中使用来检测何时没有传递参数,并在这种情况下分配默认值或执行您想要的任何操作。

于 2013-09-20T13:43:46.537 回答
0

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等,可以很方便。关于默认值,它们被非常简单地定义为等于某些东西的那些参数。在上面的例子中,xis 没有赋值,而y = true(2, 3)if 在调用函数时没有给出值。如果您还想x拥有一个默认值,可以将其更改为x (1, :) double {mustBePositive} = 0.5 * ones(1, 4).

如何在 MATLAB 中处理函数参数的名称/值对 有一个更深入的答案,希望可以让您在熟悉新功能时免于头疼。

于 2020-03-09T07:59:34.833 回答