我在a
中存储了1000行x 500列的矩阵。我还有l
和1
之间的1000个整数500
的向量。我想为所有a(i,l(i))
计算i
的总和。这可以在不使用for循环的情况下快速完成吗?
答案 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
调用中以使代码紧凑。