陈楠Matlab的cumsum复位?(Matlab cumsum reset at NaN?)

2019-07-01 13:50发布

如果我是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的的位置做到这一点是不能跨越的列不变。

提前致谢。

Answer 1:

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

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在第一/最后位置,连续NaN小号等)



Answer 2:

你可以试试下面这两个“矢量”行:

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

ans =

  1     2     3     0     1     2     0     1     2     3     4

关键是要替换NaN与将复位值cumsum0在这些点。



Answer 3:

还有,在这种对待这个问题一个很好的FEX文件的链接 。 该码具有的NaN用户指定的处理。 它允许用户用零来替换NaN,或是在他们跳过,或者对NaN的复位,保持NaN的用作占位符。



文章来源: Matlab cumsum reset at NaN?