我目前正在使用一组坐标点(经度、纬度,其中大约 60000 个)和该位置的温度。我需要对它们进行插值,以计算温度未知的某些点的值,以映射某些区域。至于尊重点之间的影响,我已将每个(长,纬)点转换为单位球点(x,y,z)。我已经开始应用“Numerical recipes 3rd Edition”中的广义多维 Shepard 插值:
Doub interp(VecDoub_I &pt)
{
Doub r, w, sum=0., sumw=0.;
if (pt.size() != dim)
throw("RBF_interp bad pt size");
for (Int i=0;i<n;i++)
{
if ((r=rad(&pt[0],&pts[i][0])) == 0.)
return vals[i];
sum += (w = pow(r,pneg));
sumw += w*vals[i];
}
return sumw/sum;
}
Doub rad(const Doub *p1, const Doub *p2)
{
Doub sum = 0.;
for (Int i=0;i<dim;i++)
sum += SQR(p1[i]-p2[i]);
return sqrt(sum);
}
如您所见,对于一个点的插值,该算法计算该点到其他每个点的距离,并将其作为最终值的权重。尽管这个算法有效,但与我需要的相比,它还是太慢了,因为我将计算很多点来映射某个区域的网格。优化这一点的一种方法是,我可以省略超出某个半径的点,但对于点数很少或没有点的区域会造成问题。另一件事是通过仅计算一次查找表并存储距离来减少每 2 个点之间距离的计算。这样做的问题是不可能存储这么大的矩阵(60000 x 60000)。获得的温度网格将用于计算不同温度值的等高线。