Performance 具有相互依赖迭代的循环矢量化

Performance 具有相互依赖迭代的循环矢量化,performance,matlab,vectorization,Performance,Matlab,Vectorization,r是一个向量: 23 1 24 5 4 3 7 8 L是一个向量 L= 2, 4, 6, 5, 3 我正在尝试将这段代码矢量化。由于迭代是相互依赖的(即,prev_weight=prev_weight-weight_from),我无法找到一种好的矢量化方法。目标显然是最小化执行时间 total_weight = sum(r(L)); prev_weight = total_weight; len=length(L); dist = 0.0; fo

r是一个向量:

23 1 24 5 4 3 7 8
L是一个向量

L=
 2, 4, 6, 5, 3
我正在尝试将这段代码矢量化。由于迭代是相互依赖的(即,
prev_weight=prev_weight-weight_from
),我无法找到一种好的矢量化方法。目标显然是最小化执行时间

    total_weight = sum(r(L));
    prev_weight = total_weight;

    len=length(L);

    dist = 0.0;
    for i=2:len-1
        from=L(i);
        to=L(i+1);
        dist = dist + d(from,to) * prev_weight;
        weight_from = r(from);
        prev_weight = prev_weight - weight_from;
    end
这种依赖关系可以追溯到一个操作,它构成了下面列出的向量化解决方案的基础-

%// Vectorized way to get "d(from,to)" across all iterations with SUB2IND
vals = d(sub2ind(size(d),L(2:end-1),L(3:end)))

%// Vectorized way to get "r(from)" as we already have all "from" indices
weight_from1 = r(L(2:end-1))

%// Magic happens here as we trace the dependency with cumsum and thus
%// get all previous weights in one go
prev_weight1 = total_weight - [0 cumsum(weight_from1(1:end-1))]

%// Finally get the distance with elementwise multiplication and summing
%// being simulated with dot product
dist_out = vals*prev_weight1.'

什么是
d
?@Divakar:d是距离矩阵(2维数组)。from和to相应地定义为L(i)和L(i+1)。此代码估计加权行程长度。我检查了您的解决方案。看起来不错。只有一个问题。虽然1中的权重与我的解决方案中的相同,但上一个权重1与我的上一个权重略有不同。为什么会发生这种情况?如果长度(L)小于或等于2怎么办?@klausos所以对于
len,我测量了向量化解决方案的总执行时间,它甚至比我原来的解决方案还要长。矢量化人员真的很烦人。在Java或C中实现正确的东西要容易得多,以便以后避免执行时间过长的问题。不过还是要谢谢你提供了一个很好的解决方案。@KlausKlausos哇,真的吗?我真的很期待矢量化的解决方案会快得多!嗯,我有点惊讶!