如何有效地访问/更改矩阵每行中的一个项目

时间:2011-06-08 08:42:52

标签: matlab

我有一个矩阵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

还有其他方法(希望更有效率)吗? 我想这与许多关于双索引的问题类似,但具体而言我一直都遇到过。

2 个答案:

答案 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线性索引也是可能的(也更具可读性)向量。这个想法基本相同。