2017-12-28 19 views
0

duration = timer(n, f, arguments_of_f)関数を実装して、のメソッドfを実行する時間を測定すると、n回実行する必要があります。私の試みは以下の通りであった:Octaveで変数の引数を渡す方法

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 

を持っていますが、私はgにのみ 1を渡すため、コールd2 = timer(100, @g, 1, 2);は、私が振り返るとき、何とか期待、ある未定義 引数x2、程度の誤差を与え、 2は使用されません。 timer(4, @g, x1, ... , xK)のような呼び出しがうまくいくように

だから、どのように、オクターブで機能timerを実装するには? xを一緒にパックするにはどうしたらいいですか?

だから、私はニシキヘビ*argsトリックのアナログを探しています:私たちはdef f(x, y): return x + yを定義し、use_f(f, 3, 4)を呼び出す場合

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

で動作します。

+0

ご質問はありますか? – excaza

+0

@excaza私はOctaveに 'timer'関数を書く方法がわからないことは明らかでしたが、私は質問を編集しました。 – Antoine

+0

@Antoine。 'timer'関数の現在の実装が何であるかを表示できますか?コードスニペットを表示しますが、そこには機能はありません。 Pythonコードは実際には無関係です。あなたのアイデアはそのままではっきりしていますが、あなたが実際に行ったことではありません。 –

答えて

3

すべての引数をまとめてパックする必要はありません。オクターブに複数の引数があり、それらがすべて必要であることを伝える必要があります。これはvariadic argumentsを使用して非常に簡単です。

オリジナルの実装はほぼ間違いなく、必要な変更は最小限です。それだけです

 
function duration = timer(n, f, varargin) 

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

を:あなたはすべてのあなたの任意の宣言されていない引数を含む魔法のセル配列である特別な名前vararginに変数arguments_to_fを変更し、直接拡張でそれを渡す代わりにする必要があります。他の機能のどれも変更する必要はありません。

関連する問題