私は現在、一連の座標点 (経度、緯度、約 60000 個) とその場所の温度で作業しています。特定の地域をマッピングするために、温度が不明ないくつかのポイントで値を計算するために、それらを補間する必要があります。ポイントがそれらの間に持つ影響を尊重するために、すべての(経度、経度)ポイントを単位球ポイント(x、y、z)に変換しました。「数値レシピ第3版」からの一般化された多次元シェパード補間の適用を開始しました。
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);
}
ご覧のように、1 つのポイントの補間では、アルゴリズムはそのポイントから他の各ポイントまでの距離を計算し、それを最終値の重みとして使用します。このアルゴリズムは機能しますが、特定の領域のグリッドをマッピングするために多くのポイントを計算するため、必要なものに比べて遅すぎます。これを最適化する 1 つの方法は、特定の半径を超えるポイントを除外することですが、ポイントがほとんどまたはまったくない領域では問題が発生します。もう 1 つの方法は、ルックアップ テーブルを 1 回だけ計算して距離を保存することにより、各 2 点間の距離の計算を減らすことです。これに関する問題は、そのような大きな行列 (60000 x 60000) を格納できないことです。得られた温度のグリッドは、さまざまな温度値の等高線を計算するために使用されます。