我有以下数组,其中包含一些NaN
条目序列:
A = [..., 14, 19, 32, 41, NaN, NaN, NaN, 4, NaN, 51, 62, 74, 58, ...]
在循环中,我想遍历数组,当我找到第一个NaN
时,我想构造另一个数组B
,其中我使用前面的4个值和在我找到的第一个NaN
之后的前4个非NaN
值。所以我的B
应该是这样的:
B = [14, 19, 32, 41, 4, 51, 62, 74, 58]
很明显,我不能使用B = A(~isnan(A))
,因为这只会创建一个A,但没有我不想要的NaN
。
有没有一种巧妙的方法可以做到这一点?
您可以使用find
获取第一个NaN
,并使用它分别从之前和之后的非NaN元素中获取最后或前4个元素:
A = [1, 2, 3, 14, 19, 32, 41, NaN, NaN, NaN, 4, NaN, 51, 62, 74, 58, 4, 5, 6];
idxNaN = find( isnan(A), 1 );
idxOK = ~isnan(A);
B = A( [ find(idxOK(1:idxNaN-1), 4, 'last'), idxNaN+find(idxOK(idxNaN+1:end), 4) ] );
B =
14 19 32 41 4 51 62 74
这里的一个好处是,find
将只返回最多4个元素(或者无论您请求多少(,因此如果在NaN
之前/之后可用的元素较少,则不会出现错误。这段代码确实假设至少有一个NaN
——您可以检查idxNaN
是否为空,以使其更加健壮。