在NaN重置Matlab cumsum?

6 matlab vectorization

如果我有一个1或NaN的向量,如下所示:

[1 1 1 NaN 1 1 NaN 1 1 1 1]
Run Code Online (Sandbox Code Playgroud)

如何在以下NaN的位置将cumsum重置为零:

[1 2 3 0 1 2 0 1 2 3 4]
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

ang*_*nor 12

您可以尝试以下两个"矢量化"行:

A(isnan(A)) = 1-diff([0 find(isnan(A))]);
cumsum(A)

ans =

  1     2     3     0     1     2     0     1     2     3     4
Run Code Online (Sandbox Code Playgroud)

诀窍是替换NaN为将重置cumsum0这些点的值.


Aki*_*nen 7

我只能想到一些通过解决方案:

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]
Run Code Online (Sandbox Code Playgroud)

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


bla*_*bla 7

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