MATLAB 是不是允许您为 python 之类的函数的输入参数分配默认值?

Posted

技术标签:

【中文标题】MATLAB 是不是允许您为 python 之类的函数的输入参数分配默认值?【英文标题】:Does MATLAB lets you assign default value for input arguments for a function like python does?MATLAB 是否允许您为 python 之类的函数的输入参数分配默认值? 【发布时间】:2013-09-25 22:15:30 【问题描述】:

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

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

在python中

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

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

【问题讨论】:

类似问题:Default Arguments in Matlab、How to deal with name/value pairs of function arguments in MATLAB,以及与这些问题相关的许多其他问题... 【参考方案1】:

对于分配默认值,如果使用exist 函数而不是nargin,可能会更容易管理。

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

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

【讨论】:

如果您更改参数的顺序,这仍然不能消除更改对函数的所有调用的需要...... 我错过了什么吗?仅当您最后对变量执行此操作时才有效?您不能仅对 arg2 执行此操作吗?或者您只是在展示这个概念? @liyuan,你为什么不能只为 arg2 做这个?它检查函数的工作区中是否存在名为 arg2 的变量。如果不存在,则创建具有默认值的变量。 @MohsenNosratinia 因为如果你这样做 f(arg1,arg3) 你不会得到传递 arg1 和 arg3 并将 arg2 分配给默认值的期望行为【参考方案2】:

如果您正在编写一个需要验证输入、默认参数值、键值对、将选项作为结构传递等的复杂函数,您可以使用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.

【讨论】:

我认为一个示例对说明 inputParser 解决方案很有用。行 p.addParamValue('highlight',true,@islogical);将使 highlight 成为函数的有效输入键;检查输入是否符合逻辑,如果未在输入 highlight 中定义,则默认为 true。很抱歉格式设置,但使用示例编辑答案被拒绝。 你去,我添加了一个例子。 +1 只要您拥有包含inputParser 的相当新版本的 MATLAB,这就是处理复杂输入参数语法(包括默认参数)的最可靠的方法。只有当您有旧版本时,您才需要使用其他使用 narginexists 的答案的语法。 这很有帮助,我现在使用 inputParser 即使是最简单的功能。谢谢【参考方案3】:

你可以用nargin来做这件事

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

但是ab 来自哪里?它们是动态分配的吗?因为这会影响这个解决方案的有效性

在谷歌搜索几秒钟后,我发现通常情况下,Loren Shure has already solved this problem for us。在这篇文章中,她准确地概述了我上面的方法,为什么它丑陋和糟糕,以及如何做得更好。

【讨论】:

不明白您的评论。 @hj-007 哪个评论?我是说什么时候选择默认值?无论如何,这无关紧要,我发布的链接中有更好的方法,该链接上的 cmets 中还有更多。【参考方案4】:

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

【讨论】:

【参考方案5】:

MathWorks 在 R2019b 中为此提供了一个新的解决方案,即 arguments 块。当然,参数块有一些规则,因此我鼓励您通过查看 Function Argument Validation 帮助页面了解更多信息。这是一个简单的例子:

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

包裹在里面的是narginchkinputParservalidateattributesvarargin等,可以很方便。关于默认值,它们非常简单地定义为等于某些东西的那些参数。在上面的例子中,x 没有赋值,而y = true(2, 3) 在调用函数时没有赋值。如果您希望 x 也具有默认值,则可以将其更改为 x (1, :) double mustBePositive = 0.5 * ones(1, 4)

How to deal with name/value pairs of function arguments in MATLAB 有更深入的回答,希望能让您在熟悉新功能时免于头疼。

【讨论】:

以上是关于MATLAB 是不是允许您为 python 之类的函数的输入参数分配默认值?的主要内容,如果未能解决你的问题,请参考以下文章

在医学图像领域,python可以取代matlab吗

matlab各种灰度变换怎么实现以及观察

在 tkinter 中,在 python 3 中,我怎样才能让一个按钮执行一个命令来执行诸如“def helloCallBack(a)”之类的功能,并允许我给出一个? [复制]

为啥诸如 :not() 和 :has() 之类的函数伪函数允许引用参数?

如何给客户一个matlab项目?

matlab中是不是有等效的python函数id()?