我有一个维度矩阵(4000x4
)(让我们称之为A
),其中包含在y轴上绘制的数据。我还有一个单独的矩阵,它是(4000,1)(让我们称之为B
),其中包含在x轴上绘制的数据。绘制时,这会产生4个单独的线图,每个列一个。
在矩阵A
中,每列中都有许多Nan(不是数字)值。我想用插值替换Nan值。我编写了一个代码来执行此操作,但它会发出警告。这是我写的代码。
A(:,:)=interp1(B,A,B(:,1),'cubic');
当我运行此代码时,由于数据间隔不均匀而发出警告。此代码也很慢。这段代码对于这项工作而言非常缓慢。我想修改代码,以便不发出警告,只插入Nan的值而不是插值每个值(如此代码所示)。我需要这样做来加速代码。
由于
答案 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;
现在将t
和x
的非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