矢量的部分总和

时间:2015-01-19 23:31:46

标签: matlab

对于向量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)很大时很慢。我可以在没有w循环的情况下计算for吗?

2 个答案:

答案 0 :(得分:6)

是的! n的{​​{1}}元素是cumsum(v)中第一个n元素的总和,所以只需取下它并减去不需要的元素之和包括:

v

答案 1 :(得分:0)

以下代码有效,但它当然不太可读:

% 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,in 每个列都包含与每个列相关的索引 部分总和。所有行都相同。 weights是合乎逻辑的 矩阵,其中,每列,包含的索引 相应的units_matrixa之间的b为1(真), 因此,元素乘法因此过滤了 “正确”的值,以及范围之外的所有索引(再次,对于 每个不同的列)乘以零。然后w结果 sum函数的行,即行向量(行的每一列) “过滤”矩阵相加)。