如果我是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的的位置做到这一点是不能跨越的列不变。
提前致谢。
如果我是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的的位置做到这一点是不能跨越的列不变。
提前致谢。
我只能想到几通解决方案:
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
小号等)
你可以试试下面这两个“矢量”行:
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
在这些点。
还有,在这种对待这个问题一个很好的FEX文件的链接 。 该码具有的NaN用户指定的处理。 它允许用户用零来替换NaN,或是在他们跳过,或者对NaN的复位,保持NaN的用作占位符。