【问题标题】:Octave/matlab, multiple default arguments defined by constantOctave/matlab,常量定义的多个默认参数
【发布时间】:2014-01-05 09:34:00
【问题描述】:

我在通过先前定义的常量在 Octave/Matlab 中定义函数的默认参数时遇到问题。有人可以给我一个提示,为什么在下面的代码中test1(1) 显示1100,而test2(1) 失败,error:testarg' undefined near line 1 column 36`?非常感谢!

testarg = 100

function test1 (arg1=testarg, arg2=100)
 disp(arg1)
 disp(arg2)
endfunction

function test2 (arg1=testarg, arg2=testarg)
 disp(arg1)
 disp(arg2)
endfunction

test1(1)
test2(2)

编辑:

请注意参数的顺序很重要:

function test3 (arg1=100, arg2=testarg)
 disp(arg1)
 disp(arg2)
endfunction

 octave:8> test1(1)
 1
 100
 octave:9>test3(1)
 error: `testarg' undefined near line 1 column 32

【问题讨论】:

  • “作品”是什么意思?您想为这些功能获得哪些结果?你实际上得到了什么?
  • 对不起,如果我不准确;第二个调用声称 testarg 未定义。我编辑了我的问题:)
  • 也许test2 期望得到两个变量?在test1 中,您定义了第二个验证,所以它没有问题......
  • 但它会不会抱怨arg2 而不是testarg?请注意我的其他编辑。感谢您的帮助。

标签: matlab arguments constants default-arguments


【解决方案1】:

我从未在 Matlab 中看到过这种语法,它是 Octave 的吗?一般来说,默认参数需要是一个常量,而不是其他可能在范围内或不在范围内或在调用函数时初始化的变量(当然,如果不是这种情况,请随时教育我) .

在常规 Matlab 中执行默认参数的“正常”方式如下:

function test1(arg1, arg2)
    if nargin < 2
        arg2 = 100;
    end
    if nargin < 1
        arg2 = testarg;     % if testarg isn't in scope this still won't work
    end
    disp(arg1);
    disp(arg2);
end

【讨论】:

  • 是的,只有 Octave 允许默认参数,MATLAB 不允许:gnu.org/software/octave/doc/interpreter/Default-Arguments.html。此外,Octave 允许内联定义函数,在这种情况下,它会创建一个闭包(这就像定义一个访问外部范围内变量的匿名函数)。当然这样的“内联函数”在 MATLAB 中也是不允许的,只允许使用通常的 test1 = @(arg1,arg2) ... 语法
  • @Amro 很高兴知道,谢谢。似乎我没有错,他们需要成为常量,谢天谢地:D
【解决方案2】:

这对我来说似乎是一个错误,您应该 report it 给 Octave 开发人员。

同时,这里有一个解决方法:

testarg = 100

function test1 (arg1, arg2)
 if nargin < 2, arg2 = 100; end
 if nargin < 1, arg1 = testarg; end

 disp(arg1)
 disp(arg2)
endfunction

test1(2)

也就是说,最好在这里明确,并将它们定义为“全局变量”。如果 testarg 打算用作常量,最好将其设为返回所述值的函数:

testarg = @() 100;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2011-08-26
    • 2021-04-08
    • 2018-12-14
    • 1970-01-01
    相关资源
    最近更新 更多