我目前正在使用一组坐标点(经度,纬度,大约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);
}
如您所见,对于一个点的插值,算法计算该点到每个其他点的距离,并将其作为最终值的权重。 即使这个算法有效,但与我需要的相比它太慢了,因为我会计算很多点来映射某个区域的网格。 优化这种方法的一种方法是,我可以省略超过一定半径的点,但是对于具有很少或没有点的区域会产生问题。 另一件事是通过仅计算一次查找表并存储距离来减少每两个点之间的距离计算。这个问题是不可能存储这么大的矩阵(60000 x 60000)。 获得的温度网格将用于计算不同温度值的轮廓。 如果有人知道优化这种算法的方法或者可能有更好的算法,我将不胜感激。
答案 0 :(得分:1)
如果您拥有大量数据点并且将采用大量插值,那么无限支持的径向基函数可能不是您想要使用的。
有些变体使用N个最近邻居和有限支持来减少每个插值必须考虑的点数。可以在此处提到的第一个解决方案Inverse Distance Weighted (IDW) Interpolation with Python中找到此变体。 (虽然我有一种唠叨的怀疑,即在某些条件下这种实现可能是不连续的 - 当然有一些变种很好)
答案 1 :(得分:0)
您的查找表不必将每个点存储在60k的正方形中,只能存储一次重复使用的点。您可以将任何坐标x
映射到int(x*resolution)
,以通过降低分辨率来提高命中率。
电源功能的类似查找表也可能有所帮助。