如何使用具有NaN值的interp1?

时间:2013-12-14 10:25:52

标签: performance matlab matrix warnings nan

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

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

A(:,:)=interp1(B,A,B(:,1),'cubic');

当我运行此代码时,由于数据间隔不均匀而发出警告。此代码也很慢。这段代码对于这项工作而言非常缓慢。我想修改代码,以便不发出警告,只插入Nan的值而不是插值每个值(如此代码所示)。我需要这样做来加速代码。

由于

2 个答案:

答案 0 :(得分:3)

我假设您的数据向量NaN中只有A,而您的x轴向量B是否正常?

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

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

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

xi = interp1( t(~isnan(x)), x(~isnan(x)) , t, 'cubic');

或者你的情况稍微复杂一点:

% 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

和无环的替代方案:

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

答案 1 :(得分:0)

使用外推选项。 这里是matlab帮助的一个例子

没有外推 vq2 = interp1(x,v,xq,'linear') vq2 = NaN NaN 14 NaN NaN

用线性外推法 vq3 = interp1(x,v,xq,'linear','extrap') vq3 = 8 10 14 4 2