2017-12-28 13 views
0

Ich möchte eine Funktion duration = timer(n, f, arguments_of_f) implementieren, die messen würde, wie viel Zeit eine Methode f mit Argumenten arguments_of_fn Mal ausgeführt werden muss. Mein Versuch war die folgende:Wie variadic Argumente in Octave übergeben werden

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 

In einer anderen Datei, ich habe

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

Der Aufruf d1 = timer(100, @f, 3); funktioniert wie erwartet.

In einer anderen Datei, ich habe

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

aber der Anruf d2 = timer(100, @g, 1, 2); gibt eine Fehlermeldung über undefined Argument x2, das ist, wenn ich zurückblicke, irgendwie zu erwarten, da ich nur 1-g passieren und 2 wird nie verwendet.

So, wie die Funktion timer in Octave zu implementieren, so dass der Anruf wie timer(4, @g, x1, ... , xK) funktionieren würde? Wie kann man die x s zusammenpacken?

Also, ich bin für die Entsprechung von Pythons *args Trick:

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

funktioniert, wenn wir def f(x, y): return x + y und rufen use_f(f, 3, 4) definieren.

+0

Was ist Ihre Frage? – excaza

+0

@excaza Es war offensichtlich, dass ich nicht weiß, wie man die "Timer" -Funktion in Octave schreibt. Ich habe die Frage bearbeitet. – Antoine

+0

@ Antoine. Können Sie zeigen, was Ihre aktuelle Implementierung der "Timer" -Funktion ist? Sie zeigen ein Code-Snippet, aber dort ist keine Funktion. Der Python-Code ist eigentlich irrelevant. Deine Idee ist klar genug, aber nicht das, was du tatsächlich getan hast. –

Antwort

3

Sie müssen nicht alle Argumente zusammenpacken, Sie müssen nur Octave sagen, dass es mehr als ein Argument gibt und dass sie alle notwendig sind. Dies ist sehr einfach mit variadic arguments.

Ihre ursprüngliche Implementierung ist fast genau richtig: Die notwendige Änderung ist minimal. Sie müssen varargin, die Variable arguments_to_f zu dem speziellen Namen, die eine magische Zellenanordnung ändern, alle beliebigen nicht angemeldeten Argumente enthält, und übergeben es mit Expansion statt direkt:

 
function duration = timer(n, f, varargin) 

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

Das ist es. Keine der anderen Funktionen muss geändert werden.

Verwandte Themen