2017-12-28 38 views
0

duration = timer(n, 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); 내가 되돌아 볼 때, 정의되지 않은 인수 x2, 대한 오류를 제공, 어떻게 든, 기대 만 g12은 사용되지 않습니다. timer(4, @g, x1, ... , xK) 같은 호출이 작동 할 수 있도록

그래서, 어떻게, 옥타브의 기능 timer를 구현하는 방법? 어떻게 x을 함께 포장 할 수 있습니까?

그래서, 파이썬 *args 트릭의 아날로그 찾고 있어요 :

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

작품을 우리가 def f(x, y): return x + y을 정의하고 use_f(f, 3, 4)를 호출하는 경우.

+0

무엇이 당신의 질문입니까? – excaza

+0

@excaza 옥타브에서'timer' 함수를 쓰는 방법을 모르겠다. 나는 그 질문을 편집했다. – Antoine

+0

@Antoine. 'timer' 함수의 현재 구현이 무엇인지를 보여줄 수 있습니까? 코드 스 니펫을 표시하지만 기능은 없습니다. 파이썬 코드는 실제로는 관련이 없습니다. 귀하의 아이디어는 그대로는 분명하지만 실제로 그것에 대한 아이디어는 아닙니다. –

답변

3

모든 인수를 함께 묶을 필요는 없으며, Octave에게 하나 이상의 인수가 있고 모두 필요하다는 것을 알리면됩니다. 이것은 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을 변경하고 직접 확장으로 전달하는 대신해야합니다. 다른 기능 중 어느 것도 변경해야합니다.