我想实现一个函数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}}至1
和g
永远不会被使用。
那么,如何在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
,则有效。
答案 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
那就是它。其他功能都不需要改变。