Matlab中与边缘NaN值相关的"interp2"问题

3

我遇到了一个简单的练习问题,需要一些帮助。

我正在尝试使用Matlab中的“interp2”函数对维度为[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个回答

2
他们被标记为“NaN”,是因为在网格之前和之后没有数据可以进行插值。线性插值使用在“Xi,Yi”处的场的梯度,以估算该点的值。如果两侧都没有数据,则无法进行插值。
您可以使用“extrapval”参数来外推您指定的“X,Y”之外的值。只需在“linear”后面添加参数“0”即可:
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的“外部”或“默认”值,请使用其他值。

附:为什么要将tmin_interp创建为三维数组?


+1,只是要补充一点,注意向量[15:1.5:32]将在31.5终止,而不是32。因此,尝试插值到32确实超出了您提供的数组的范围。 - user85109

0

或者尝试:

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

为了避免强制使用0值。

希望对你有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接