如何在 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
,当我回头看时,这是意料之中的,因为我只通过了
1
到 g
和 2
从未使用过。
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 x
s 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 的其他功能需要更改。
我想实现一个函数 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
,当我回头看时,这是意料之中的,因为我只通过了
1
到 g
和 2
从未使用过。
So, how to implement the function
timer
in Octave, so that the call liketimer(4, @g, x1, ... , xK)
would work? How can one pack thex
s 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 的其他功能需要更改。