循环中的嵌套索引

时间:2016-11-01 13:31:17

标签: matlab for-loop indexing vectorization

我有一个for循环执行当前操作:

T = [1,1,1,4,5,6,3];
A = [20,15,4,21,14,3];
l = length(T);

% how can we vectorize this?
for(i = 1:l)
    A(T(i)) = A(T(i)) + 1;
end

简单地说,它使用T向量作为索引列表,以特定顺序在A数组上递增。例如,数组A中的第一个元素将增加3次(对应于T中的3个元素),而其余元素增加一次,2不增加。因此,对A的更改是:

A = [23,15,5,22,15,4];

但是,理想情况下,我想在这里避免for循环。在我尝试之前:

A(T) = A(T) + 1;

这没有用; MATLAB只是忽略了重复的索引。有没有我可以通过矢量化或其他方式在for循环中执行操作?

2 个答案:

答案 0 :(得分:3)

使用accumarray

T = [1,1,1,4,5,6,3];
A = [20,15,4,21,14,3];
res = A + accumarray(T(:), 1, [numel(A) 1]).';

答案 1 :(得分:0)

[q,w] = hist(T,0:numel(A));
A(w(q>0)) = A(w(q>0)) + q(q>0);


A =

23    15     5    22    15     4

说明:

您可以使用hist了解每个索引在T中出现的时间。 由于索引是整数,因此您可以指定范围从0到A的元素数。

Hist将返回两个向量:

q是每个索引的出现次数:

q =

0     3     0     1     1     1     1     0     0     0     0

w是索引本身:

w =

0     1     2     3     4     5     6     7     8     9    10

然后,您只需将至少发生一次w(q>0)的索引作为要更新的A的索引,并按发生次数更新这些索引q(q>0)