如何在Octave中传递可变参数

时间:2017-12-28 18:41:31

标签: octave variadic-functions

我想实现一个函数duration = timer(n, f, arguments_of_f)来衡量一个参数f的方法arguments_of_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);给出了关于undefined的错误 参数x2,当我回头看时,不知怎的预期,因为我只是通过了 <{1}}至1g永远不会被使用。

  

那么,如何在Octave中实现函数2,以便调用就好   timer可行吗?如何将timer(4, @g, x1, ... , xK)打包在一起?

所以,我正在寻找Pythons x技巧的类比:

*args
如果我们定义def use_f(f, *args): f(*args) 并致电def f(x, y): return x + y,则

有效。

1 个答案:

答案 0 :(得分:3)

你不需要将所有的论据打包在一起,你只需要告诉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   

那就是它。其他功能都不需要改变。