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