关于边缘处NaN的Matlab“interp2”问题

时间:2011-09-19 22:12:11

标签: matlab interpolation

我有点坚持一个简单的练习,并会感激一些帮助。

我正在尝试使用Matlab中的“interp2”函数进行一些简单的2D插值,以获得维度[15x12]的变量'tmin':

lat = 15:1.5:32;
lon = 70:1.5:92;

lat_interp = 15:1:32;
lon_interp = 70:1:92;

[X,Y]   = meshgrid(lat,lon);
[Xi,Yi] = meshgrid(lat_interp,lon_interp);

tmin_interp = zeros(length(lon_interp),length(lat_interp),Num_Days);
tmin_interp(:,:) = interp2(X,Y,tmin(:,:),Xi,Yi,'linear');

此代码导致tmin_interp的最后一行和最后一列为NaN,即:

tmin_interp(23,1:18) ==> NaN
tmin_interp(1:23,18) ==> NaN

有谁知道我可能做错了什么?关于插值设置我是否犯了一个简单的错误?谢谢你的时间。

2 个答案:

答案 0 :(得分:2)

它们nan的原因是网格之前和之后没有数据要插入到。线性插值使用Xi,Yi处的场的梯度,以估计该点处的值。如果任何一方都没有,那就不可能。

您可以使用extrapval参数在您指定的X,Y之外进行推断。只需在0之后添加参数'linear'

interp2(X,Y,tmin(:,:),Xi,Yi,'linear', 0);

这将使'边缘'上的点数为零。但是,对于外部点,它们可能会下降到某个默认值,如零。为此,您可以在tmin之前和之后添加零:

tmin_padded = [  zeros(1,size(tmin,2)+2)
                zeros(size(tmin,1),1) tmin  zeros(size(tmin,1),1)
                zeros(1,size(tmin,2)+2)  ];

(尚未检查过,但您明白了。)您还需要为XY添加一些前置和后置值。

使用其他值,如果这是tmin的“外部”或“默认”值。

PS为什么要将tmin_interp创建为三维?

答案 1 :(得分:0)

或者只是尝试:

interp2(X,Y,tmin(:,:),Xi,Yi,'spline');

避免强加0值。

HTH!