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,这就是处理复杂输入参数语法(包括默认参数)的最可靠的方法。只有当您有旧版本时,您才需要使用其他使用 nargin
或 exists
的答案的语法。
这很有帮助,我现在使用 inputParser 即使是最简单的功能。谢谢【参考方案3】:
你可以用nargin来做这件事
function out = some_fcn(arg1, arg2)
switch nargin
case 0
arg1 = a;
arg2 = b;
%//etc
end
但是a
和b
来自哪里?它们是动态分配的吗?因为这会影响这个解决方案的有效性
在谷歌搜索几秒钟后,我发现通常情况下,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
包裹在里面的是narginchk
、inputParser
、validateattributes
、varargin
等,可以很方便。关于默认值,它们非常简单地定义为等于某些东西的那些参数。在上面的例子中,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 之类的函数的输入参数分配默认值?的主要内容,如果未能解决你的问题,请参考以下文章
在 tkinter 中,在 python 3 中,我怎样才能让一个按钮执行一个命令来执行诸如“def helloCallBack(a)”之类的功能,并允许我给出一个? [复制]