【问题标题】:Matlab - convert number to zero when cumsum of previous data greater than a specific numberMatlab - 当先前数据的累积和大于特定数字时将数字转换为零
【发布时间】:2021-01-24 07:53:53
【问题描述】:

我有一个包含两列的矩阵。

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

column 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
    ...

你可以看到两个不同日期的数据是用同一个进程分开处理的。

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

有没有办法递归呢?

非常感谢!

油箱

【问题讨论】:

    标签: matlab


    【解决方案1】:

    我认为在你的情况下不需要递归,简单的矩阵索引会为你做:

    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:计算第一个日期,然后将与该日期相关的所有第一个 col 归零,然后为下一个日期(cumsum 前一个日期的 0 -> 忽略它们) , 等等。 2:cumsum 仅用于使用索引的相关日期,例如:cumsum(my_mat(cumsum(my_mat(:,1))>2 & my_mat(:,2)==8,1) 我不在 MATLAB 前面,所以请注意我刚刚编写的伪代码是正确的,只是为了给出一个方向。如果还是不行,你可以再评论一下,我稍后会在 MATLAB 上试试。
    • 我把我的问题更新的更清楚了,再次感谢您的帮助!
    • 感谢您的指导!我将在 MATLAB 上尝试一下,看看它是否有效。
    • 对不起,我是MATALAB的初学者,在您的指导下尝试了一些方法,但仍然无法解决问题。我认为它仍然需要递归,因为该过程必须单独处理日常数据。我已经更清楚地更新了我的问题,你能重新阅读它并在 MATLAB 上做一些测试吗?非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    相关资源
    最近更新 更多