Matlab中具有> = 0限制的累积和

时间:2014-10-14 09:23:08

标签: matlab cumulative-sum

我想计算一个向量的累积和,但是一旦总和变为负数就停止求和,并在正元素处重新开始。

示例:

我们有一个载体:

[1 1 -1 -1 -1 -1 1 1 1 1]

正常的累积总和将是:

[1 2 1 0 -1 -2 -1 0 1 2]

但我想:

[1 2 1 0 0 0 1 2 3 4]

我能提出的唯一解决方案是循环遍历向量的元素:

test = [1 1 -1 -1 -1 -1 1 1 1 1];
testCumsum = zeros(size(test));

for i=1:length(test)
    if i==1
        testCumsum(i) = test(i);
    else
        testCumsum(i) = testCumsum(i-1) + test(i);
    end

    if testCumsum(i)<0
        testCumsum(i) = 0;
    end
end

是一个更matlab-ish的解决方案吗?

(总和可以变为负数任意次数,向量可以变得非常大,元素可以是任意数字,而不仅仅是1和-1)

2 个答案:

答案 0 :(得分:2)

您将无法对其进行矢量化,因为您必须根据以前的元素决定每个元素。您可以找到正面和负面运行的区域,但它会不必要地复杂,我不知道您是否可以获得自己的解决方案。

以下是输入A和输出C的代码的简化:

C=A;
C(1) = max(C(1), 0);
for k=2:numel(C)
    C(k) = max(C(k-1)+C(k), 0);
end

答案 1 :(得分:-1)

call your vector x, 
y=x >0 
z=x.*y
sum(z)

y向量是0/1,其中x的元素大于0,得到z的点积将负值设置为0,然后你可以求和

_Ah我更清楚地看到你现在想要做什么, - 循环可能是最快的,如果数组很大并且使用parfor来加速它你可以分成块段