2011-09-30 29 views
1

這裏的另一個問題:Matlab的:優化這個(PT 2)

ValidFirings = ((DwellTimes > 30/(24*60*60)) | (GroupCount > 1)); 

for i = length(ValidFirings):-1:2 
    if(~ValidFirings(i)) 
     DwellTimes(i-1) = DwellTimes(i)+DwellTimes(i-1); 
     GroupCount(i-1) = GroupCount(i)+GroupCount(i-1); 
     DwellTimes(i) = []; 
     GroupCount(i) = []; 
     ReducedWallTime(i) = []; 
     ReducedWallId(i) = []; 
    end 
end 

看來,目的是總結基於傳感器發射是否被認爲是有效的「dwelltimes」。所以我有一個傳感器點火的向量,即如果當前行未被標記爲有效,Im向後走向並且總結到前一行。

我可以在C/C++中看到它,但我不知道如何將它轉換爲更好的Matlab向量表示法。就目前來看,這個循環速度很慢。

編輯: 我可以使用某種形式的DwellTimes = DwellTimes(cumsum(ValidFirings))嗎?

回答

1

我會先按照圖示合併,然後消除無效數據。這避免了數據的不斷調整。請注意,由於值傳播的方式,您不能顛倒FOR循環的順序。

ValidFirings = ((DwellTimes > 30/(24*60*60)) | (GroupCount > 1)); 

for i = length(ValidFirings):-1:2 
    if (~ValidFirings(i)) 
     DwellTimes(i-1) = DwellTimes(i) + DwellTimes(i-1); 
     GroupCount(i-1) = GroupCount(i) + GroupCount(i-1); 
    end 
end 

DwellTimes  = DwellTimes(ValidFirings); 
GroupCount  = GroupCount(ValidFirings); 
ReducedWallTime = ReducedWallTime(ValidFirings); 
ReducedWallId = ReducedWallId(ValidFirings); 
+0

我得到第一部分:刪除'清除記憶'部分。我沒有看到第二部分發生了什麼。看起來它會將ValidFirings向量應用於DwellTimes等值之前的值。這些價值觀將不再適用。 – ethrbunny

+0

查找邏輯下標。它和'DwellTimes = DwellTimes(find(ValidFirings));'等一樣,所以你只保留了'ValidFirings == true'的部分。 – Nzbuu

2

與您之前的問題一樣,替換for循環應該會提高性能。

%# Find the indices for invalid firings 
idx = find(~(DwellTimes > 30/(24*60*60)) | (GroupCount > 1)); 

%# Index the appropriate elements and add them (start the addition 
%# from the second element) 
%# This eliminates the for loop 
DwellTimes(idx(2:end)-1) = DwellTimes(idx(2:end)-1)+DwellTimes(idx(2:end)); 
GroupCount(idx(2:end)-1) = GroupCount(idx(2:end)-1)+GroupCount(idx(2:end)); 

%# Now remove all the unwanted elements (this removes the 
%# first element if it was a bad firing. Modify as necessary) 
GroupCount(idx)=[]; 
DwellTimes(idx)=[]; 
+0

謝謝!我仍然很神祕的矢量化符號在Matlab中。每一段代碼都有幫助! – ethrbunny