2016-11-15 60 views
3

我有相等數目的行的兩個列矩陣:矢量被存儲在相同的載體數據

其中一個列矩陣的(我們稱之爲T)是按升序排列的非週期性唯一整數集合。 T可通過進行模擬:

​​3210

其它柱基質(我們稱之爲C)具有0或1,並且表示在對應行中T在隨後的操作狀態。 0是不太可能超過1 C發生可以通過模擬:

C=ones(100,1); 
C(randperm(100,10))=0; 

在現實中,這些列的矩陣將有幾百萬的元素,這裏的例子是故意短,以提高測試速度。

我們逐步穿過C的每一行。如果C中的元素的值爲0,則將從每個T行中的所有後續值中減去T中的對應行值,直到我們在C中達到另一個0。

我現在正試圖矢量化以下操作以提高在幾百萬個元素矩陣上操作時的速度。

lastReset = 0; 
newT = NaN*zeros(length(T),1); 
for index = 1:length(C) 
    if C(index) == 0 
     lastReset = T(index); 
    else 
     newT(index) = T(index) - lastReset; 
    end 
end 
newT(C==0)=[]; 

我該如何矢量化上述for循環?

+0

你的問題是什麼? – saygins

+0

親愛的saygins,對不起,我沒有包括一個問題。現在我編輯了指定我的請求的帖子。謝謝。 –

回答

1

通常情況下,用「跑」像這樣的操作,關鍵命令是指數與cumsum輸出數組:

inds = (C == 0); 
subT = [0; T(inds)];  
newT = T - subT(cumsum(inds)+1); 
newT(inds) = []; 

但是,至少在R2010a版本(是的,舊的),它實際上較慢比你的循環大N,只有稍微更快的小N

雖然這很難理解。