我有一个矩阵A,其大小(nr,nc),列索引B的向量(所以B的大小(nr,1),B中的每个元素都是1到nc之间的整数),我想要对A中的每个元素做一些事情,其形式为A(i,B(i)),对于i在1和nr之间,效率是关键问题。 具体来说,C是一个大小为(nr,1)的向量,目标是做
for i=1:nr
A(i,B(i))=A(i,B(i))+C(i)
end
更有效率。上下文通常是nr>> nc(因为当nr是大矢量化对于许多操作是有效的)。通过使用指标函数方法,我获得了3倍的加速:
for k=1:nc
A(:,k)=A(:,k)+(k==B).*C
end
还有其他方法(希望更有效率)吗? 我想这与许多关于双索引的问题类似,但具体而言我一直都遇到过。
答案 0 :(得分:2)
使用线性索引:
idx = sub2ind(size(A), 1:nr, B');
A(idx) = A(idx) + C';
或(编辑版少一个转置)
idx = sub2ind(size(A), (1:nr)', B);
A(idx) = A(idx) + C;
答案 1 :(得分:0)
一种方法是使用矩阵的线性索引。您需要一个向量v
来保存每行中第一个元素的偏移量,然后使用A(v + B)
进行索引。例如:
>A=[1 2 3; 4 5 6; 7 8 9]
A =
1 2 3
4 5 6
7 8 9
>B = [1 2 3] % we want the 1st element of row 1, 2nd of row 2, 3rd of row 3
>ii = [0 3 6] + B
>a(ii)
1 5 9
注意:正如 groovingandi 所示,使用sub2ind
生成ii
线性索引也是可能的(也更具可读性)向量。这个想法基本相同。