我想计算一个向量的累积和,但是一旦总和变为负数就停止求和,并在正元素处重新开始。
示例:
我们有一个载体:
[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)
答案 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来加速它你可以分成块段