2012-07-19 243 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環這樣避免if語句:'對於i = 1 + W:MW '。 – Bentoy13 2012-07-19 11:44:17

+1

您可以指定您正在使用的'm','n','l'和'd'的值嗎? – 2012-07-19 12:30:37

+0

@ Bentoy13這當然是第一次改進。另外,我在計算中看不到'k'的任何影響。據我可以看到所有的頁面是相同的 - >使用'repmat'。 – denahiro 2012-07-19 12:49:11

回答

2

我發現攻擊這些東西的好方法是漸進式的。首先檢查最內層循環中的所有內容,然後查看是否可以在更高層次上完成。這將減少重複的計算。

例如,您可以執行你的if (i-w >= 1 && i+w <= m)兩個級別更高(因爲它只取決於iwm),如果減少檢查和跳過循環迭代。 一旦完成,您的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。然後,您可以重新定義i範圍並刪除if條件。 – Charliemops 2012-07-19 14:38:36