如何从Matlab中的向量中删除可变数量的连续NaN值?

jje*_*omi 3 matlab interpolation

我有一个值向量,如下所示:

1
2
3
NaN
4
7
NaN
NaN
54
5
2
7
2
NaN
NaN
NaN
5
54
3
2
NaN
NaN
NaN
NaN
4
NaN
Run Code Online (Sandbox Code Playgroud)

我该怎么用

interp1

以这种方式只插入可变数量的连续NaN值?例如,我想只插入那些最多有三个连续NaN值的NaN值.因此NaN,NaN NaNNaN NaN NaN将被插值而不是NaN NaN NaN NaN.

谢谢你的任何帮助=)

PS如果我不能用interp1这样做,任何想法如何以另一种方式做到这一点?=)

举个例子,我给出的矢量将成为:

1
2
3
interpolated
4
7
interpolated
interpolated
54
5
2
7
2
interpolated
interpolated
interpolated
5
54
3
2
NaN
NaN
NaN
NaN
4
interpolated
Run Code Online (Sandbox Code Playgroud)

Eit*_*n T 5

首先,找到所有NaN值序列的位置和长度:

nan_idx = isnan(x(:))';
nan_start = strfind([0, nan_idx], [0 1]);
nan_len = strfind([nan_idx, 0], [1 0]) - nan_start + 1;
Run Code Online (Sandbox Code Playgroud)

接下来,找到NaN不插入的元素的索引:

thr = 3;
nan_start = nan_start(nan_len > thr);
nan_end = nan_start + nan_len(nan_len > thr) - 1;
idx = cell2mat(arrayfun(@colon, nan_start, nan_end, 'UniformOutput', false));
Run Code Online (Sandbox Code Playgroud)

现在,插入所有内容并替换不应使用NaN值插回的元素:

x_new = interp1(find(~nan_idx), x(~nan_idx), 1:numel(x));
x_new(idx) = NaN;
Run Code Online (Sandbox Code Playgroud)