向量的部分和
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_matrix
和 b_matrix
,在
他们的每一列,都包含与每个相关的索引
部分求和。所有行都相同。 weights
是合乎逻辑的
矩阵,其中对于每一列,索引包含在
units_matrix
对应的a
和b
之间都是1(true),
其余为0。元素乘法因此过滤了
"right" 个值,以及范围外的所有索引(同样,对于
每个不同的列)乘以零。 w
就是他的结果
sum
函数的,即行向量(的每一列
"filtered" 矩阵求和)。
对于一个向量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_matrix
和b_matrix
,在 他们的每一列,都包含与每个相关的索引 部分求和。所有行都相同。weights
是合乎逻辑的 矩阵,其中对于每一列,索引包含在units_matrix
对应的a
和b
之间都是1(true), 其余为0。元素乘法因此过滤了 "right" 个值,以及范围外的所有索引(同样,对于 每个不同的列)乘以零。w
就是他的结果sum
函数的,即行向量(的每一列 "filtered" 矩阵求和)。