向量的部分和

Partial sum of a vector

对于一个向量v(例如v=[1,2,3,4,5])和两个索引向量(例如a=[1,1,1,2,3]b=[3,4,5,5,5],所有a(i)<b(i)),我想构造 w=sum(v(a:b)),它给出值

w = zeros(length(a),1);
for i = 1:length(a)
    w(i)=sum(v(a(i):b(i)));
end

length(a)大时速度慢。我可以在没有 for 循环的情况下计算 w 吗?

是的! cumsum(v) 的第 n 个元素是 v 中前 n 个元素的总和,所以只需取它并减去不需要的元素的总和包括:

v=[1,2,3,4,5]
a=[1,1,1,2,3]
b=[3,4,5,5,5]

C=cumsum(v)
C(b)-C(a)+v(a)

%// or alternatively
C=cumsum([0 v])
C(b+1)-C(a)

以下代码有效,但当然可读性差得多:

% assume v is a column vector 
units = 1:length(v); units = units'; %units is a column vector
units_matrix = repmat(units, [1 length(a)]);
a_matrix = repmat(a, [length(v) 1]); % assuming a is is a row vector
b_matrix = repmat(b, [length(v) 1]);
weights = (units_matrix>=a_matrix) & (units_matrix<=b_matrix);

v_matrix = repmat(v, [1 length(a)]);
w = sum(v_matrix.*weights);

解释:

  • v_matrix 包含 v 的副本。总结将一起完成 列,所以我们需要准备其他需要的信息 矢量化形式。 units_matrix 包含 v 中的索引 列。列是相同的。 a_matrixb_matrix,在 他们的每一列,都包含与每个相关的索引 部分求和。所有行都相同。 weights 是合乎逻辑的 矩阵,其中对于每一列,索引包含在 units_matrix对应的ab之间都是1(true), 其余为0。元素乘法因此过滤了 "right" 个值,以及范围外的所有索引(同样,对于 每个不同的列)乘以零。 w 就是他的结果 sum 函数的,即行向量(的每一列 "filtered" 矩阵求和)。