如何在Matlab中从矢量中移除可变数量的连续NaN值

  • 本文关键字:连续 NaN Matlab 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

如何使用

interp1

以这样的方式,只有一个可变数量的连续nan值将被插值?例如,我想只插入那些最多有三个连续的nan值的nan值。所以NaNNaN NaNNaN NaN NaN将被插入,而不是NaN NaN NaN

谢谢你的帮助=)

注:如果我不能用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

首先求出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;

我知道这在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

最新更新