【问题标题】:Vectorizing 'for' loops向量化“for”循环
【发布时间】:2011-12-11 06:24:05
【问题描述】:

这段代码可以按我的意愿工作,但是本着良好的 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 中进行矢量化代码的直观方法是什么?

【问题讨论】:

  • 我不确定您的代码是否符合您的要求。以下输入会报错:previous = [-1 -1 1]?

标签: matlab vectorization


【解决方案1】:

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

【讨论】:

  • 逻辑下标会更好
【解决方案2】:

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

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

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

请注意,如果 idx 包含重复的索引,这与您的原始索引不同。

【讨论】:

    【解决方案3】:

    我会这样做:

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

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

    【讨论】:

      猜你喜欢
      • 2019-05-17
      • 2021-06-27
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      相关资源
      最近更新 更多