2011-12-11 70 views
0

這段代碼的工作,我也想,但在良好的MATLAB代碼的精神,有沒有辦法向量化這個(以前是AKX 1個向量):向量化「的」循環

start = zeros(k,1); 
for i = 2:length(previous) 
    if (previous(i-1) == -1) 
     start(previous(i))= start(previous(i))+1; 
    end  
end 

一般來說,什麼是在MATLAB中向量化代碼的直觀方式?

+0

我不確定您的代碼是否符合您的要求。以下輸入會給出一個錯誤:'previous = [-1 -1 1]'? – Nzbuu

回答

1

你可以做到這一點沒有find,以獲得最佳性能:

I = [false; previous(1:end-1) == -1]; 
idx = previous(I); 
start(idx) = start(idx) + 1; 

這也避免了風險previous(end) == -1,這將導致索引超出範圍的錯誤替代方案。

請注意,如果idx包含重複的索引,則這與您的原始文件不一樣。

2

在MATLAB中使用find命令,該命令返回矢量爲TRUE的索引(i)。所以:

% precache indices i where previous(i-1) == 1 
idx = find(previous==-1)+1; 
start(previous(idx)) = start(previous(idx))+1; 

我預先緩存idx的原因是在情況下previous是一個大的載體,做find需要一段時間。否則,你可能只是做

start(find(previous==-1)+1) = start(find(previous==-1)) + 1; 
+0

這對邏輯下標會更好 – Nzbuu

0

我會做這樣的事情:

prev_is_minus1 = [false; previous(1:end-1)==-1] 
start = accumarray(previous(prev_is_minus1), 1, k) 

我相信這已經爲您發佈的代碼迴路同樣的效果。