Matlab-当先前数据的总和大于特定数字时,将数字转换为零

Matlab-当先前数据的总和大于特定数字时,将数字转换为零,matlab,Matlab,我有一个两列的矩阵 第一列是由0和1组成的一组数据 列tow是一组每天的时间数据 下面是一个示例数据: 0 2020-01-01 1 2020-01-01 1 2020-01-01 0 2020-01-01 1 2020-01-01 1 2020-01-01 0 2020-01-01 1 2020-01-02 0 2020-01-02 ... 当一天内先前数据的总和大于某个特定数字时,我想将以下数据设置为零 根据示例数据,如果具体数字设置为2,则2020-01-01的数据将转换为以下数据: 0

我有一个两列的矩阵

第一列是由0和1组成的一组数据

列tow是一组每天的时间数据

下面是一个示例数据:

0 2020-01-01
1 2020-01-01
1 2020-01-01
0 2020-01-01
1 2020-01-01
1 2020-01-01
0 2020-01-01
1 2020-01-02
0 2020-01-02
...
当一天内先前数据的总和大于某个特定数字时,我想将以下数据设置为零

根据示例数据,如果具体数字设置为2,则2020-01-01的数据将转换为以下数据:

0 2020-01-01
1 2020-01-01
1 2020-01-01
0 2020-01-01
0 2020-01-01
0 2020-01-01
0 2020-01-01
以下是我如何在一天内做到这一点:

for i = 1:7
    if cumsum(data(1:i,1) > 2)
      then data(i) = 0
    end
end
但我还没有弄清楚如何递归地进行

递归表示第二天的数据将重新计算总和,并在总和大于特定数字时将以下数据转换为0。

根据上面的例子:

    1 2020-01-01
    1 2020-01-01
    0 2020-01-01
    1 2020-01-02
    0 2020-01-02
    0 2020-01-02
    1 2020-01-02
    1 2020-01-02
    0 2020-01-02
    1 2020-01-02
    ...
第二天的数据将按如下方式转换:

    0 2020-01-01
    1 2020-01-01
    1 2020-01-01
    0 2020-01-01
    0 2020-01-01
    0 2020-01-01
    0 2020-01-01
    1 2020-01-02
    0 2020-01-02
    0 2020-01-02
    1 2020-01-02
    0 2020-01-02
    0 2020-01-02
    0 2020-01-02
    ...
您可以看到两个不同日期的数据是通过相同的流程分别处理的。

我只知道我必须将总和设置为零,并在日期更改时重新计算总和

有没有递归的方法

非常感谢


gastray

我认为递归在您的情况下是不必要的,简单的矩阵索引将为您提供:

my_mat =

 0     8
 1     8
 1     8
 0     8
 1     8
 1     8
 0     8
 1     8
 0     8
让我们将
my_mat
作为您的矩阵,并使用索引操作它:

my_mat((cumsum(my_mat(:,1))>2),1) = 0
输出:

my_mat =

 0     8
 1     8
 1     8
 0     8
 0     8
 0     8
 0     8
 0     8
 0     8
让我们分离命令:

cumsum(my_mat(:,1))
生成一个二元向量,当满足条件时为真,否则为0

0
0
0
0
1
1
1
1
1
现在,我们可以使用这个向量作为向量索引,只访问矩阵中的相关条目

现在,如果您想进入下一步,并且仅当第二列为8时才将值更改为0,我们将改进索引向量中的条件,如下所示:

my_mat((cumsum(my_mat(:,1))>2 & my_mat(:,2)==8))=0

谢谢你的回答!但在考虑第二天的数据时存在一个问题。我想在第二天的数据中重新计算总数。我已经测试了您提供的代码,并考虑了一会儿。它无法每天重新计算总和。您的意思是只想
cumsum
计算相关日期的总和吗?如果是这样,您可以采用两种方法之一=>1:计算第一个日期,然后将与该日期相关的所有第一列归零,然后计算下一个日期(
cumsum
0的前一个日期->忽略它们),依此类推。2:
cumsum
仅适用于使用索引的相关日期,例如:
cumsum(my_mat(cumsum(my_mat(:,1))>2和my_mat(:,2)==8,1)
我不在MATLAB前面,所以请注意,确保我刚才编写的伪代码是正确的,但只是为了给出一个方向。如果某些东西仍然不起作用,您可以再次评论,我稍后将在MATLAB上尝试。我已更清楚地更新了我的问题,再次感谢您的帮助!感谢您的指导!我将在MATLAB上尝试,看看它是否有效。对不起,我是MATALAB的初学者,我在你的指导下尝试了一些方法,但仍然无法解决问题。我认为它仍然需要递归,因为这个过程必须分别处理每天的数据。我已经更清楚地更新了我的问题,你能重读它并在MATLAB上做一些测试吗?非常感谢!