0

这个问题与如何在 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];

我想找到满足两个条件的累积总和:

% 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

编辑:使用下面的代码,我得到了错误的输出。

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
4

2 回答 2

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:恐怕我没有更多时间来帮助你解决这个问题,所以我建议你重写你的程序以显式地循环遍历数据数组来构建累积总和。

于 2010-07-08T09:25:48.857 回答
0

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

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

请注意,这适用于满足您的两个条件(如下所述)的累积总和:

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

对我来说,这会产生一个输出

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

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

于 2010-08-16T00:45:56.470 回答