【问题标题】:Matlab cumsum reset at NaN?Matlab cumsum 在 NaN 处重置?
【发布时间】:2012-10-21 05:57:26
【问题描述】:

如果我有一个像这样的 1 或 NaN 向量:

[1 1 1 NaN 1 1 NaN 1 1 1 1]

如何在 NaN 的位置将 cumsum 重置为零,如下所示:

[1 2 3 0 1 2 0 1 2 3 4]

理想情况下,我希望有一个矢量化解决方案,因为我需要对大型矩阵中的每一列都执行此操作,并且 NaN 的位置在各列中不是恒定的。

提前致谢。

【问题讨论】:

    标签: matlab vectorization


    【解决方案1】:

    您可以尝试以下两条“矢量化”行:

    A(isnan(A)) = 1-diff([0 find(isnan(A))]);
    cumsum(A)
    
    ans =
    
      1     2     3     0     1     2     0     1     2     3     4
    

    诀窍是将NaN 替换为在这些点将cumsum 重置为0 的值。

    【讨论】:

    • 我认为这仅适用于由 1 和 nans 组成的向量,因为 find 返回索引。
    【解决方案2】:

    我只能想到几个通过的解决方案:

    v = [1 1 1 NaN 1 1 1 1 NaN 1];
    a = v==v;              %% convert the values first to [1 1 1 0 1 1 1 1 0 1] format
    n = a==0;              %% positions of the NaNs
    c = cumsum(a);         %% your intermediate result
    d = diff([0 c(n)]);    %% runs of ones
    v(n) = -d;             %% replace Nans by -3, -4      [1 1 1 -3 1 1 1 1 -4 1] 
    cumsum(v)              %% the answer [1 2 3 0 1 2 3 4 0 1]
    

    注意:尚未检查极端条件(NaN 在第一个/最后一个位置,连续的NaNs 等)

    【讨论】:

      【解决方案3】:

      link 中有一个很好的 FEX 文件可以处理这个问题。该代码对 NaN 进行了用户指定的处理。它允许用户用零替换 NaN,或者跳过它们,或者重置 NaN,将 NaN 保持为占位符。

      【讨论】:

      • 对于适用的文件交换条目总是 +1。重用!
      猜你喜欢
      • 2013-08-14
      • 2013-01-19
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 2017-02-06
      • 2015-06-23
      相关资源
      最近更新 更多