這段代碼的工作,我也想,但在良好的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中向量化代碼的直觀方式?
這段代碼的工作,我也想,但在良好的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中向量化代碼的直觀方式?
你可以做到這一點沒有find
,以獲得最佳性能:
I = [false; previous(1:end-1) == -1];
idx = previous(I);
start(idx) = start(idx) + 1;
這也避免了風險previous(end) == -1
,這將導致索引超出範圍的錯誤替代方案。
請注意,如果idx
包含重複的索引,則這與您的原始文件不一樣。
在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;
這對邏輯下標會更好 – Nzbuu
我會做這樣的事情:
prev_is_minus1 = [false; previous(1:end-1)==-1]
start = accumarray(previous(prev_is_minus1), 1, k)
我相信這已經爲您發佈的代碼迴路同樣的效果。
我不確定您的代碼是否符合您的要求。以下輸入會給出一個錯誤:'previous = [-1 -1 1]'? – Nzbuu