【问题标题】:Partial sum of a vector向量的部分和
【发布时间】:2015-01-19 23:31:45
【问题描述】:

对于一个向量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 吗?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    是的! cumsum(v) 的 nth 元素是 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)
    

    【讨论】:

    • 非常感谢。你为我节省了很多时间。
    【解决方案2】:

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

    % 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 是合乎逻辑的 矩阵,其中,对于每一列,包含在 对应的a和b之间的units_matrix为1(真), 其余为 0。因此,逐元素乘法过滤 “正确”的值,以及范围之外的所有索引(同样,对于 每个不同的列)乘以零。 w 是他的结果 sum 函数,即行向量( “过滤”矩阵相加)。

    【讨论】:

    • 我明白了。我还考虑过构建一个指标矩阵(你的权重矩阵),你为我提供了一种方法,谢谢。虽然存储不是我的问题,但大卫的建议似乎更简单(而且更快?)。
    • David 的解决方案当然更简单更好,因为cumsum 是直接实现的(它必须做一些类似于我的代码的事情,但它是预编译的,因此速度更快)。我根本不记得这个功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2011-02-15
    相关资源
    最近更新 更多