我有一个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
循环中执行操作?
答案 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)