2

我目前正在使用一组坐标点(经度、纬度,其中大约 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)。获得的温度网格将用于计算不同温度值的等高线。

4

2 回答 2

1

如果您有大量数据点并且将采用大量插值,则具有无限支持的径向基函数可能不是您想要使用的。

有一些变体使用 N 个最近邻和有限支持来减少每个插值必须考虑的点数。可以在此处提到的第一个解决方案中找到其变体Inverse Distance Weighted (IDW) Interpolation with Python。(尽管我怀疑这种实现在某些条件下可能是不连续的——当然有一些变体很好)

于 2011-10-10T10:39:30.000 回答
0

您的查找表不必存储60k 方格中的每个点,只需存储一次重复使用的点即可。您可以将任何坐标映射xint(x*resolution)以通过降低分辨率来提高命中率。

幂函数的类似查找表也可能有所帮助。

于 2011-10-10T10:18:25.663 回答