如何将 interp1 与 NaN 值一起使用?

use*_*914 2 performance matlab warnings matrix nan

我有一个维度矩阵 ( 4000x4) (我们称之为A),其中包含绘制在 y 轴上的数据。我还有一个单独的矩阵 (4000,1) (我们称之为B),其中包含绘制在 x 轴上的数据。绘制时,会生成 4 个独立的线图,每一列一个。

在矩阵中,A每一列都有许多 Nan(不是数字)值。我想用插值替换 Nan 值。我已经编写了一个代码来执行此操作,但它发出警告。这是我写的代码。

A(:,:)=interp1(B,A,B(:,1),'cubic');
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,由于数据分布不均匀而发出警告。而且这段代码非常慢。这段代码对于这项工作来说相当慢。我想修改代码,以便不发出警告,并且仅对 Nan 值进行插值,而不是对每个值进行插值(如此代码所示)。我需要这样做来加快代码速度。

谢谢

the*_*alk 5

我假设你的数据向量中只有NaNsA并且你的 x 轴向量B没问题?

例如,采用t从 1 到 100 的等距时间向量。以及数据向量x,其中每第十个值是NaN

% example data
t = 1:100;
x = 100*t-t.^2;
x(10:10:end) = NaN;
Run Code Online (Sandbox Code Playgroud)

现在,将tx的所有值NaN作为样本点,并用完整的时间向量t作为查询点对它们进行插值。

xi = interp1( t(~isnan(x)), x(~isnan(x)) , t, 'cubic');
Run Code Online (Sandbox Code Playgroud)

或者对于您的情况来说稍微复杂一些:

% example data
B = (1:4000)';                 % 4000x1 double
A = repmat(1000*B-B.^2,4,1)';  % 4000x4 double
A(randi(400,40,1)) = NaN;      % random NaNs in your data matrix

Ai = zeros(size(A));
for ii = 1:size(A,2);
    tmp = A(:,ii);
    Ai(:,ii) = interp1( B(~isnan(tmp)) , tmp(~isnan(tmp)) , B, 'cubic');
end
Run Code Online (Sandbox Code Playgroud)

以及无循环的替代方案:

C  = num2cell(A,1);
Ci = cellfun(@(x) interp1( B(~isnan(x)), x(~isnan(x)), B,'cubic'), C, ...   
             'UniformOutput',false);
Ci = cell2mat(Ci')';
Run Code Online (Sandbox Code Playgroud)