2013-03-05 84 views
3

我很欣賞我如何可能會向量化下面的for循環(MATLAB)建議:我怎樣才能向量化for循環(MATLAB)

summ=0; 
    for i=1:lasti 
     summ=summ+abs(newTS(m+i*k)-newTS(m+(i-1)*k)); 
    end 

通過矢量化我的意思是使用矩陣運算,而不是for循環。我聽說矢量化通常比循環更高效,更快速。

編輯:其實我真的想矢量化下面。我包括它的情況下,一些勇敢的靈魂想給它一個鏡頭...

for j=1:length(kvec) 
     k=kvec(j); 
     for m=1:k 
      lasti=floor((N-m)/k); 
      Nfact=(N-1)/(lasti*k); 
      summ=0; 
      for i=1:lasti 
       summ=summ+abs(newTS(m+i*k)-newTS(m+(i-1)*k)); 
      end 
      L(m,j)=(summ*Nfact)/k; 
      %Avg over m 
      AvgL(j)=mean(L(:,j)); 
     end 
    end 
+0

你應該指定變量''和'k'的大小以及'newTS()'是否也適用於向量。否則這個問題就不能很好地回答。 – 2013-03-05 07:20:17

+0

還要指定'newTS'是一個函數還是僅僅是一個你正在提取元素的矩陣。如果'newTS'是一個函數,它必須在這個循環完全優化之前進行矢量化。 – user57368 2013-03-05 07:23:29

+0

@ H.Muster我認爲m和k的大小在我剛剛編輯後應該清楚。 – ben 2013-03-05 07:39:04

回答

3

基本上要總結newTS(m+i*k)newTS(m+(i-1)*k)之間的所有的距離,這樣你就可以做這樣的事情

summ = sum(abs(diff(newTS(m:k:m+lasti*k)))) 

我同意你的觀點,根據我對Matlab的經驗,矩陣運算通常比for循環快很多。我儘可能避免它們。

編輯:我認爲替換內部的i循環應該足夠適合你。也許你可以通過將newTS重塑爲m來代替m,但由於lasti對於每個m都不相同,所以在你的情況下可能會非常棘手。

+0

謝謝。增量有一些問題:k:但我想我可以根據這個答案來解決它。 – ben 2013-03-05 07:59:43

+0

@ben確保'k'是一個整數。 – LWZ 2013-03-05 08:03:03

+0

是k是整數。問題在於第i個元素和第i-1個元素之間的差異,所以我必須想出一些方法來通過一個元素來抵消其中一列。 – ben 2013-03-05 08:06:22