我有一个值向量,如下所示:
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
我该如何使用
interp1
以这种方式只插入可变数量的连续NaN值?例如,我想只插入那些最多有三个连续NaN值的NaN值。因此 NaN , NaN NaN 和 NaN NaN NaN 将进行插值,但不会 NaN NaN NaN NaN 。
感谢您的帮助=)
P.S。如果我不能用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
答案 0 :(得分: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;
接下来,找到不要插入的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));
现在,插入所有内容并用NaN
值替换不应该插回的元素:
x_new = interp1(find(~nan_idx), x(~nan_idx), 1:numel(x));
x_new(idx) = NaN;
答案 1 :(得分:0)
我知道这是matlab中的一个坏习惯,但我认为这个特殊情况需要一个循环:
function out = f(v)
out = zeros(numel(v));
k = 0;
for i = 1:numel(v)
if v(i) ~= NaN
if k > 3
out(i-k:i - 1) = ones(1, k) * NaN;
else
out(i-k: i - 1) = interp1();%TODO: call interp1 with right params
end
out(i) = v(i)
k = 0
else
k = k + 1 % number of consecutive NaN value encoutered so far
end
end