正在创建一个忽略NaN项的新数组



我有以下数组,其中包含一些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是否为空,以使其更加健壮。

相关内容

  • 没有找到相关文章

最新更新