2013-07-17 3 views
0

나는 최대한 효율적으로 저장하고 내 MATLAB 모양 함수를 호출하는 방법을 찾으려고 노력하고있어. 내가 간격 x=linspace(0,20)과 위치 벡터matlab 모양 함수의 효율적인 저장

count = 10; 
for i=1:count 
    pos(i)=rand()*length(x); 
end 

이 그리고 지금, 나는 컴팩트 지원 또는 모자 - 기능 또는 유사한 뭔가 가우스 - 커널과 같은 모든 위치 pos(j) 형상 함수에 넣을 (그것은 할 수 있어야한다 프로토 타입 기능을 쉽게 변경). 이 기능의 지원은 평활화 길이 h에 의해 제어됩니다. 그래서 내가 같이하는 .m 파일에서 함수 (예 : 큐빅 스플라인)

function y = W_shape(x,pos,h) 

l=length(x); 
y=zeros(1,l); 
if (h>0) 
    for i=1:l 
     if (-h <= x(i)-pos && x(i)-pos < -h/2) 
      y(i) = (x(i)-pos+h)^2; 
     elseif (-h/2 <= x(i)-pos && x(i)-pos <= h/2) 
      y(i) = -(x(i)-pos)^2 + h^2/2; 
     elseif (h/2 < x(i)-pos && x(i)-pos <=h) 
      y(i) = (x(i)-pos-h)^2; 
     end 
    end 
else 
    error('h must be positive') 
end 

그리고이 너무 좋아 지금까지

w = zeros(count,length(x)); 
for j=1:count 
    w(j,:)=W_shape(x,pos(j),h); 
end 

같은 간격 x 내 기능을 구성을 구성하지만 때 내가 x=linspace(0,20,10000)count=1000을 만들면, 내 컴퓨터 (Intel Core-i7)가 몇 분이면 모든 것을 계산할 수 있습니다. 일종의 PDE-Solver이어야하므로이 절차는 모든 시간 단계 (특정 상황에서)에서 수행되어야합니다. 내 문제는 내 함수 호출에 대한 인수로 x을 사용하고 저장소 대신 모든 함수를 저장하고 이동한다고 생각하지만 내 matlab 지식은 그렇게 좋지 않으므로 조언이 필요합니까? Fyi : 두 개 이상의 함수 지원이 교차하는 영역의 통합이 필요합니다 ... 1D에서이 작업을 완료하면 2D 함수에 대해 수행해야하므로 효율적이어야합니다.

답변

1

한 초기 벡터화는 W_shape 기능에 for 루프를 제거하는 것입니다 :

for i=1:l 
    if (-h <= x(i)-pos && x(i)-pos < -h/2) 
     y(i) = (x(i)-pos+h)^2; 
    elseif (-h/2 <= x(i)-pos && x(i)-pos <= h/2) 
     y(i) = -(x(i)-pos)^2 + h^2/2; 
    elseif (h/2 < x(i)-pos && x(i)-pos <=h) 
     y(i) = (x(i)-pos-h)^2; 
    end 
end 

이보다 아마도 더 나은 최적화가

xmpos=x-pos; % compute once and store instead of computing numerous times 
inds1=(-h <= xmpos) & (xmpos < -h/2); 
y(inds1) = (xmpos(inds1)+h).^2; 
inds2=(-h/2 < xmpos) & (xmpos <= h/2); 
y(inds2) = -(xmpos(inds2).^2 + h^2/2; 
inds3=(h/2 < xmpos) & (xmpos <=h); 
y(inds3) = (xmpos(inds3)-h).^2; 

될 수 있습니다.

EDIT : 실제로 깜빡 한 점을 알아야 프로파일 러를 사용해야합니다.

profile on 
run_code 
profile viewer 
+0

와우, 많은 도움이되었습니다. 감사. 이제는 CPU 사용량이 가장 많은 부분이 제 모양 기능이 아니라는 것을 알았습니다 (예를 들어 효율이 엄청나게 향상되었지만).하지만 교차점을 찾고 해당 영역의 적분을 계산하는 함수입니다. –