2011-06-14 3 views
2

큰 벡터를 반환하고 여러 번 호출되는 함수가 있는데 벡터 라이 제이션을 옵션으로 만들지 않는 호출 사이에서 일부 논리가 진행됩니다.함수가 호출 될 때마다 반환 값에 대한 메모리 할당을 피하는 방법

함수의 예

function a=f(X,i) 

a=zeros(size(X,1),1); 
a(:)=X(:,i); 

end 

이며,이 프로파일은 언제

for i=1:n a=f(X,i); end 

를 수행하고 (크기 (X, 1) = 5.10^5 N = 100) 시간은 0.12이다 두 번째 줄의 a (:) = X (:, i)에 대해서는 0.22 초입니다. 예상 메모리는 '0'라인의 f 호출마다 할당됩니다.

그 라인과 0.12s 제거하려면, 그냥 한 번에 반환 값을 할당하고,과 같이 적절한 함수 g에 반환 공간으로 때마다 그것을 전달의 생각 :

function a=g(X,i,a) 
     a(:)=X(:,i); 
end 

및 무엇 그다지 놀라운 것은 g 내부 그 프로파일이

a=zeros(m,1); 
    for i=1:n a=g(X,i,a); end 

하고 여전히 메모리에 동일한 양으로 할당되는 표시 A (:) = X (:, I); 라인, 그리고 찍은 시간은 매우 많이 같은 0.12 + 0.22s입니다.

1) 이건 그냥 내가 쓰고 있기 때문에 "lazy copy on write"입니까? 2) 앞으로 옵션은 무엇입니까? -a (지저분한 ..)에 대한 전역 변수? 는 (정말해야합니까?) 매트릭스 핸들 클래스를 -writing 합니다 (nested function way이 중첩 기능을 몇 가지 무거운 재 설계 X 것은 알려져하는 (그 대답에서 표기)와 행렬 A를 의미합니다 ..) 아마이

+0

결국 C++로 모든 것을 다시 작성해야합니다. 실제 상황이 다음과 같기 때문에 MEX 파일의 n 루프가 많은 atm 작업을하는 것 같습니다. function fhandle = get_functor (X) fhandle = @ f1; % X는 실제로 f1의 매개 변수입니다. function s = f1 (i) s = sin (X./i); end end % begin 스크립트 % X는 ("코드 * 인수 분해 *") 다양한 방법으로 정의됩니다. f = get_functor (X); 그래서 M- 루프를 위해 MEX 파일을 사용한다고 상상해 봅니다. X를 그 C 함수에 알려야합니다. 실제 상황은 내가 다른 X의 몇 10 가지에 대해서 이것을하고 있으며, 더 추가/더하는 것뿐입니다. 물건을 테스트하는 것. – imateapot

답변

0

귀하의 질문에 조금 접선이지만, 이것이 성능에 중요한 응용 프로그램이라면, 나는 좋은 방법은 mex 파일로 함수를 다시 작성하는 것입니다 생각합니다. 여기 http://www.mathworks.com/support/tech-notes/1600/1605.html#intro에서 인용

MEX-파일을 작성하는 주된 이유

은 다음과 같습니다 ... 속도; 효율성을 위해 병목 현상 계산 (예 : for-loops)을 MEX 파일로 다시 작성할 수 있습니다.

mex 파일에 익숙하지 않은 경우 위 링크를 시작해야합니다. 기존 함수를 C/C++로 변환하는 것은 지나치게 어렵지 않아야합니다. MATLAB에 포함 된 yprime.c 예제는 ode45 등에서 미분을 계산하기 위해 반복적으로 호출되기 때문에 수행하려는 것과 비슷합니다.

+0

고맙다 나는 그것에 조사 할 것이다! – imateapot

관련 문제