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]).';