3

次のような値のベクトルがあります。

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 値のみが補間されるような方法ですか? たとえば、最大で 3 つの連続した NaN 値がある NaN 値のみを補間したいとします。したがって、 NaNNaN NaN、およびNaN 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
4

2 に答える 2

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;
于 2013-04-17T07:10:19.773 に答える
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
于 2013-04-17T07:02:18.813 に答える