MATLAB如何执行满足两个条件的cumsum?

时间:2010-07-08 08:34:08

标签: matlab cumulative-sum

此问题与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

2 个答案:

答案 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)])> 0diff([0;data(:,2); 0])~= 0会生成不同长度的向量。

编辑:运算符&可能是你想要的,因为它将在你的两个数组上逐个元素地运行。

编辑2 :我担心我没有更多的时间来帮助你,所以我建议你重写你的程序,以显式循环数据数组,建立累积总和,因为它去

答案 1 :(得分:0)

按照你写的问题(只是满足你的两个条件),你需要一个像这样的索引表达式:

index = data(:,1) & ([0;diff(data(:,2))] == 0);

请注意,此应用累积金额,同时满足您的两个条件(重述如下):

  1. 第1列为1的行
  2. 第2列与上一行匹配或第一行
  3. 的行

    对我来说,这会产生

    的输出
    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
    

    也就是说,这不会产生您想要的输出,因此您的条件或所需的输出都是错误的。