큰 벡터를 반환하고 여러 번 호출되는 함수가 있는데 벡터 라이 제이션을 옵션으로 만들지 않는 호출 사이에서 일부 논리가 진행됩니다.함수가 호출 될 때마다 반환 값에 대한 메모리 할당을 피하는 방법
함수의 예
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를 의미합니다 ..) 아마이
결국 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