В настоящее время я работаю с набором координатных точек (долгота, широта, около 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);
}
Как видите, для интерполяции одной точки алгоритм вычисляет расстояние этой точки докаждый из остальных пунктов и принимая его в качестве веса в конечном значении.Хотя этот алгоритм работает, он слишком медленный по сравнению с тем, что мне нужно, так как я буду вычислять много точек, чтобы отобразить сетку определенного региона.Одним из способов оптимизации этого является то, что я мог бы опустить точки, которые находятся за пределами определенного радиуса, но это создаст проблему для областей с небольшим количеством точек или без них.Другая вещь заключается в том, чтобы уменьшить вычисление расстояния между каждыми 2 точками, вычисляя только один раз справочную таблицу и сохраняя расстояния.Проблема в том, что невозможно хранить такую большую матрицу (60000 x 60000).Полученная сетка температур будет использоваться для расчета контуров для разных значений температуры.Если кто-нибудь знает способ оптимизировать этот алгоритм или, возможно, помочь с лучшим, я буду признателен за это.