Matlab 循环中的嵌套索引

Matlab 循环中的嵌套索引,matlab,for-loop,indexing,vectorization,Matlab,For Loop,Indexing,Vectorization,我有一个用于执行当前操作的循环: 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

我有一个
用于执行当前操作的
循环:

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
循环中的操作

[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)
作为要更新的索引,并根据出现次数
q(q>0)
更新这些索引,方法是:

A+accumarray(T(:),1[numel(A)1])”
否则Matlab会抱怨:当SUBS是列向量时,第三个输入SZ的形式必须为[n1]。同样
s=accumarray(T(:),1);w=1:numel(s);A(w)=A(w)+s
T = [1,1,1,4,5,6,3];
A = [20,15,4,21,14,3];
res = A + accumarray(T(:), 1, [numel(A) 1]).';