Matlab 对于不接受varargin的函数,narginchk(x,x)是冗余的吗?
我对MATLAB世界还不熟悉。环顾四周,我遇到了一个函数Matlab 对于不接受varargin的函数,narginchk(x,x)是冗余的吗?,matlab,Matlab,我对MATLAB世界还不熟悉。环顾四周,我遇到了一个函数 function out = f(x, y, z) narginchk(3, 3); out = x * y * z; % contents simplified for illustration purpose end 我不能自信地说“narginchk”是多余的,但在我看来确实如此。有人能告诉我,如果函数签名alreadys需要(这里)正好3个输入,那么是否有合法的理由将其放入 谢谢 即使没有varargin
function out = f(x, y, z)
narginchk(3, 3);
out = x * y * z; % contents simplified for illustration purpose
end
我不能自信地说“narginchk”是多余的,但在我看来确实如此。有人能告诉我,如果函数签名alreadys需要(这里)正好3个输入,那么是否有合法的理由将其放入
谢谢 即使没有
varargin
,调用方也可以省略参数。因此需要narginchk
来捕捉这一点
varargin
主要用于标记的选项,在这些选项中,不能仅根据位置为参数指定有意义的名称
下面是一个小演示,说明MATLAB默认情况下使所有参数都是可选的:
function out = f(x, y, z)
narginchk(2, 3);
if nargin < 3
z = 17;
end
out = x * y * z;
end
>> f(1,2)
ans =
34
函数out=f(x,y,z)
narginchk(2,3);
如果nargin<3
z=17;
终止
out=x*y*z;
终止
>>f(1,2)
ans=
34
部分混乱是您收到的错误消息的措辞。MATLAB说“没有足够的输入参数”。它的意思是“函数使用了缺少的参数。”即使没有
varargin
,调用方也可以忽略参数。因此需要narginchk
来捕捉这一点
varargin
主要用于标记的选项,在这些选项中,不能仅根据位置为参数指定有意义的名称
下面是一个小演示,说明MATLAB默认情况下使所有参数都是可选的:
function out = f(x, y, z)
narginchk(2, 3);
if nargin < 3
z = 17;
end
out = x * y * z;
end
>> f(1,2)
ans =
34
函数out=f(x,y,z)
narginchk(2,3);
如果nargin<3
z=17;
终止
out=x*y*z;
终止
>>f(1,2)
ans=
34
部分混乱是您收到的错误消息的措辞。MATLAB说“没有足够的输入参数”。它的意思是“函数使用了缺少的参数。”在这种形式中,它是多余的。但是,如果没有向函数传递足够的参数,则会引发不同的错误,具体取决于是否使用
narginchk
。
如果您尝试在不使用narginchk(3,3)的情况下执行f(1,2)
,则抛出的错误类型为MATLAB:minrhs
。如果narginchk(3,3)
已就位,则抛出的错误类型为MATLAB:narginchk:notEnoughInputs
。
但是,如果尝试使用过多的参数,例如f(1,2,3,4)
,则错误类型始终为MATLAB:TooManyInputs
因此,对具有固定数量参数的函数使用
narginchk
在某种程度上是有区别的,但我认为对于您可能得到的不同类型的错误,没有很多实际用途。在这种形式中,它是多余的。但是,如果没有向函数传递足够的参数,则会引发不同的错误,具体取决于是否使用narginchk
。
如果您尝试在不使用narginchk(3,3)的情况下执行f(1,2)
,则抛出的错误类型为MATLAB:minrhs
。如果narginchk(3,3)
已就位,则抛出的错误类型为MATLAB:narginchk:notEnoughInputs
。
但是,如果尝试使用过多的参数,例如f(1,2,3,4)
,则错误类型始终为MATLAB:TooManyInputs
因此,对具有固定数量参数的函数使用
narginchk
在某种程度上会有所不同,但我认为对于您可能遇到的不同类型的错误,没有很多实际用途。我不是专家,但它似乎是多余的。我不是专家,但它似乎是多余的。谢谢您的回复。你能给我一个“调用方省略参数”的例子吗?MATLAB将允许result=f(5)你有“函数签名需要三个参数”的想法,但在MATLAB中这不是真的。真的吗?如果我将上面的代码片段复制到MATLAB中,并删除narginchk,它仍然(对我来说)抱怨“使用f(第3行)时出错,\n没有足够的输入参数。”如果我调用f(1,2)@Derek:只有在使用省略的参数时(第3行)才会出现该错误。想象一下,如果函数有600行长,并且第一次使用缺少的参数是在第471行,那么会有多混乱。如果愿意,您还可以将缺少的参数更改为默认值。感谢演示。我确实读了更多关于函数中如何使用可选参数的内容,并且可以了解为什么这实际上是非冗余的。谢谢你的回复。你能给我一个“调用方省略参数”的例子吗?MATLAB将允许result=f(5)你有“函数签名需要三个参数”的想法,但在MATLAB中这不是真的。真的吗?如果我将上面的代码片段复制到MATLAB中,并删除narginchk,它仍然(对我来说)抱怨“使用f(第3行)时出错,\n没有足够的输入参数。”如果我调用f(1,2)@Derek:只有在使用省略的参数时(第3行)才会出现该错误。想象一下,如果函数有600行长,并且第一次使用缺少的参数是在第471行,那么会有多混乱。如果愿意,您还可以将缺少的参数更改为默认值。感谢演示。我确实读了更多关于函数中如何使用可选参数的内容,并且可以看出为什么这实际上是非冗余的。谢谢磁强计。这是充分的信息。认可的!你的回答自相矛盾。如果MATLAB检查调用参数的数量,则不会到达narginchk
行。但它是…@BenVoigt我只是记录Matlab的行为,而不是解释它。我在Matlab2013a中测试了它,这就是我得到的结果。不过,你的测试不够详细,无法揭示真实的行为。谢谢磁强计。这是充分的信息。认可的!你的回答自相矛盾。如果MATLAB检查调用参数的数量,则不会到达narginchk
行。但它是…@BenVoigt我只是记录Matlab的行为,而不是解释它。我在Matlab2013a中测试了它,这就是我得到的。你的测试没有详细说明