2012-07-19 5 views
3

나는 for 루프를 matlab 프로그램에서 세 번 중첩했습니다. 여러분 중 누구라도 최적화 할 수 있습니까?matlab에 중첩 된 for 루프를 최적화하는 방법

w=5; 
a = rand(m*n,10); b=rand(m,n); 
for i = 1 : m 
    for j = 1 : n 
     for k = 1 : l 
     if (i-w >= 1 && i+w <= m) 
      featureL = a(((i-1)*n)+j,:); featureR = a(((i-1)*n)+j-d,:); 
      D1(i,j,k) = sqrt(sum((featureL - featureR) .* (featureL - featureR))); 
      D2(i,j,k) = mean2(b(i-w:i+w, j-w:j+w)); 
     end 
     end 
    end 
end 

성능이 meshgrid를 사용하여 크게 향상 될 수 있지만 그 방법을 잘 모르겠습니다.

미리 감사드립니다.

은 이런 식으로 뭔가를 할 수 있습니다 ..

[X Y Z] = meshgrid(1:m,1:n,1:l); 
D1(something containing X,Y,Z) = sqrt(sum((a(something cont. X,Y) - a(something cont. X,Y)).*(a(something cont. X,Y) - a(something cont. X,Y)))); 
% similarly D2 

감사합니다 많이!

+2

아니 전체 대답하지만, 빠른 힌트 시작 : 다음은이 중 일부를 적용하여 코드는 다음과 같이 가장 outter는 루프를 수정하여 경우 문을 피하기 : MW : 'I = 1 + w에 대한 '. – Bentoy13

+1

작업중인'm','n','l' 및'd'의 값을 지정할 수 있습니까? –

+0

@ Bentoy13 이것은 확실히 첫 번째 개선점입니다. 또한 나는 계산에'k'의 영향을 보지 못합니다. 내가 아는 한 모든 페이지는 동일합니다 ->'repmat'을 사용하십시오. – denahiro

답변

2

이러한 것들을 공격하는 좋은 방법은 점진적으로 발견되었습니다. 가장 안쪽 루프의 모든 것을 검사하고 더 높은 레벨에서 수행 할 수 있는지 확인하십시오. 이렇게하면 반복되는 계산이 줄어 듭니다. (그것은 단지 i, wm에 의존하기 때문에)

예를 들어, 당신은 감소, 당신의 if (i-w >= 1 && i+w <= m) 두 가지 수준 높은 수행 할 수있는 경우 검사 및 루프 반복을 건너 뛰는. 완료되면 featureLfeatureR 계산을 한 단계 위로 이동할 수 있습니다. 루프는 k 루프 내에서 수행되지만 j에만 의존합니다. 비슷하게 sqrt(sum((featureL - featureR) .* (featureL - featureR)))k 루프 외부에서 계산되어 변수에 입력되고 나중에 할당 될 수 있습니다.

사실, 내가 볼 수있는 한, k 루프는 없으므로 k은 사용되지 않습니다.

w=5; 
a = rand(m*n,10); 
b=rand(m,n); 
for i = 1 : m 
    if (i-w >= 1 && i+w <= m) 
     for j = 1 : n 
      featureL = a(((i-1)*n)+j,:); 
      featureR = a(((i-1)*n)+j-d,:); 
      x = sqrt(sum((featureL - featureR) .* (featureL - featureR))); 
      y = mean2(b(i-w:i+w, j-w:j+w))   
      D1(i,j,:) = x;    
      D2(i,j,:) = y; 
     end  
    end 
end 
+0

이 코드에서는 1에서 m까지 반복하지만, if 조건은 실제 유효 값이 i + w (코드에서 6)에서 m-w까지였습니다. 그런 다음 for i 범위를 재정의하고 if 조건을 삭제할 수 있습니다. – Charliemops

관련 문제