此问题与How can I perform this cumulative sum in MATLAB?有关。
是否可以使用两个条件来执行cumsum?或只是一个条件?
编辑:
data = [1 22 20;... %# Initial data
1 22 22;...
1 22 20;...
1 44 11;...
0 44 12;...
1 33 99;...
1 33 20;...
1 33 50];
我想找到满足2个条件的累计和:
% 1) current row in column 1 = 1 && previous row in column 1==1;
% 2) current row in column 2 = previous row in column 2
data(:,4) = cumsum(data(:,3)); % Add a 4th column containing
% the cumulative sum of column 3
index = diff([0;data(:,1)])> 0 && diff([0;data(:,2); 0])~= 0;
offset = cumsum(index.*(data(:,4)-data(:,3)));
data(:,4) = data(:,4)-offset;
index = (data(:,1) == 0);
data(index,4) = data(index,3)
预期输出:
data = [1 22 20 20 >> 20 + 0
1 22 20 40 >> 20 + 20
1 44 11 84 >> 11 + 40
0 44 12 12 >> 12 + 0
1 33 99 99 >> 99 + 0
1 33 20 119 >> 20 + 99
0 33 50 50 >> 50 + 0
EDITED: 使用下面的代码,我得到了错误的输出。
index = diff([0;data(:,1)])> 0 & diff([0;data(:,2)])~=0
1 22 20 20
1 22 22 42
1 22 20 62
1 44 11 73 %this supposed to be 11 not 73 ..
0 44 12 12
1 33 99 99
1 33 20 119
1 33 50 169
答案 0 :(得分:0)
我很慢,还不太明白你想要做什么。你能用文字描述吗?当你这样做时,分开你想要操作的数组数据元素的规范,以及累积和的规范Matlab函数cumsum
不带任何条件,你必须编写Matlab语句来选择你想先求和的数据。
你的第二个条件data(1:end-1)==data(2:end)
看起来很可疑,因为它们使用的线性索引可能不是你想要的。如果您不理解术语线性索引,请尝试使用一些引用,例如data(4)和data(24),即将一维索引转换为二维数组。
所以声明
index = diff([0;data(:,1)])> 0 && diff([0;data(:,2); 0])~= 0;
引发错误。你在这里要做的是以交互方式使用Matlab构建你想要逐个执行的语句。那么,
[0;data(:,1)]
产生你期望的结果?你明白它产生了什么吗?接下来,问一下
的相同问题diff([0;data(:,1)])
然后
diff([0;data(:,1)])> 0
继续前进。在某些时候,你会发现Matlab不能达到预期的效果 - 这是因为你的期望是错误的。
最后,有一件事是绝对错误的,即子表达式diff([0;data(:,1)])> 0
和diff([0;data(:,2); 0])~= 0
会生成不同长度的向量。
编辑:运算符&
可能是你想要的,因为它将在你的两个数组上逐个元素地运行。
编辑2 :我担心我没有更多的时间来帮助你,所以我建议你重写你的程序,以显式循环数据数组,建立累积总和,因为它去
答案 1 :(得分:0)
按照你写的问题(只是满足你的两个条件),你需要一个像这样的索引表达式:
index = data(:,1) & ([0;diff(data(:,2))] == 0);
请注意,此仅应用累积金额,同时满足您的两个条件(重述如下):
对我来说,这会产生
的输出data(index,4) = cumsum(data(index,3))
data =
1 22 20 20
1 22 22 42
1 22 20 62
1 44 11 0
0 44 12 0
1 33 99 0
1 33 20 82
1 33 50 132
也就是说,这不会产生您想要的输出,因此您的条件或所需的输出都是错误的。