【问题标题】:How to remove variable amount of consecutive NaN values from vector in Matlab?如何从 Matlab 中的向量中删除可变数量的连续 NaN 值?
【发布时间】:2013-04-17 06:45:41
【问题描述】:

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

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 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

【问题讨论】:

  • 我们是否假设向量的每个元素与下一个元素等距的线性插值?
  • 是 =) 没错
  • interp1 在插入最后一个 NaN 时会出现问题。只是说'。

标签: matlab interpolation


【解决方案1】:

首先,找到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 优秀的解决方案。我喜欢在arrayfun中使用@colon
【解决方案2】:

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

【讨论】:

  • k 在第一次运行时未定义,interpl() 是什么?
  • 感谢您的回答=)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多