矢量化行查找

时间:2014-12-20 22:22:40

标签: matlab matrix octave vectorization

我在a中存储了1000行x 500列的矩阵。我还有l1之间的1000个整数500的向量。我想为所有a(i,l(i))计算i的总和。这可以在不使用for循环的情况下快速完成吗?

2 个答案:

答案 0 :(得分:3)

您可以计算元素要求和的元素的线性指数,然后找到标量和值。所以,这应该非常有效 -

nrows = size(a,1) %// number of rows in input matrix a
idx = (l(:)-1)*nrows + [1:nrows]' %//'# linear indices of elements to be summed up
                                        %// OR idx = sub2ind(size(a),[1:nrows]',l(:))
sumval = sum(a(idx)) %// index into a and get the sum value

答案 1 :(得分:2)

我建议的另一种方法是创建logical矩阵true,其中所有值均为N,以便它们位于从1到{{1}的行位置其中N是直接使用l向量的行数和列位置。然后,您将使用此logical矩阵索引到矩阵a,然后汇总所有条目。换句话说:

s = sparse(1:size(a,1), l, true);
sumval = sum(a(s));
在我们的例子中,

size(a,1)将是N,因为这会计算总行数。我刚决定将它放在sparse调用中以使代码紧凑。