矢量化' for'循环

时间:2011-12-11 06:24:06

标签: matlab vectorization

这段代码按照我的意愿工作,但是在良好的MATLAB代码的精神下,有没有办法对它进行矢量化(以前是k x 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中进行代码矢量化的直观方法是什么?

3 个答案:

答案 0 :(得分:2)

在MATLAB中使用find命令,该命令返回向量为i的索引(TRUE)。所以:

% 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;

答案 1 :(得分:1)

您可以在没有find的情况下执行此操作,以获得最佳效果:

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

这也避免了previous(end) == -1的风险,这会导致替代方案中的索引超出范围错误。

请注意,如果idx包含重复索引,则此功能与原始功能不同。

答案 2 :(得分:0)

我会做类似的事情:

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

我相信这与您发布的代码循环具有相同的效果。