如何在 Octave 中传递可变参数

How to pass variadic arguments in Octave

我想实现一个函数 duration = timer(n, f, arguments_of_f),该函数可以衡量带有参数 arguments_of_f 的方法 f 需要 运行 n 的时间次。我的尝试如下:

function duration = timer(n, f, arguments_of_f)

duration = 0;
for i=1:n
    t0 = cputime;
    f(arguments_of_f);
    t1 = cputime;
    duration += t1 - t0;
end   

在另一个文件中,我有

function y = f(x)
y = x + 1;
end

调用 d1 = timer(100, @f, 3); 按预期工作。

在另一个文件中,我有

function y = g(x1, x2)
y = x1 + x2;
end

但是调用 d2 = timer(100, @g, 1, 2); 给出了关于未定义的错误 argument x2,当我回头看时,这是意料之中的,因为我只通过了 1g2 从未使用过。

So, how to implement the function timer in Octave, so that the call like timer(4, @g, x1, ... , xK) would work? How can one pack the xs together?

所以,我正在寻找 Python 的类似物 *args 技巧:

def use_f(f, *args):
    f(*args)

如果我们定义 def f(x, y): return x + y 并调用 use_f(f, 3, 4) 就可以工作。

你不需要把所有的参数打包在一起,你只需要告诉 Octave 有不止一个参数要来,而且它们都是必要的。使用 variadic arguments.

很容易做到这一点

您的原始实现几乎是正确的:必要的更改很少。您需要将变量 arguments_to_f 更改为特殊名称 varargin,这是一个包含所有任意未声明参数的神奇元胞数组,并通过扩展而不是直接传递它:

function duration = timer(n, f, varargin)

duration = 0;
for i=1:n
    t0 = cputime;
    f(varargin{:});
    t1 = cputime;
    duration += t1 - t0;
end   

就是这样。 None 的其他功能需要更改。