обратная весовая интерполяция - PullRequest
1 голос
/ 02 февраля 2010

Я бы хотел вычислить вес как обратную величину расстояния для чего-то вроде весовой интерполяции обратного расстояния .

double wgt = 0, wgt_tmp, result = 0;
for (int i = 0; i < num; i++) {
   wgt_tmp = 1.0/dist[i];
   wgt += wgt_tmp;
   result += wgt_tmp * values[i];
}
results /= wgt;

Однако расстояние может быть 0, и мне нужно сделать вес пригодным для вычислений. Если есть только одно расстояние dist[i], равное 0, я бы хотел, чтобы его соответствующее значение values[i] было доминантным . Если есть несколько расстояний 0, я бы хотел, чтобы их значения способствовали равному результату. Также, даже если dist[i] не ноль, а очень маленький, я хотел бы иметь разумный критерий, чтобы проверить его и разобраться с ним. Есть идеи, как это реализовать?

Ответы [ 3 ]

5 голосов
/ 08 июня 2011

Если есть нулевое расстояние, нет необходимости в интерполяции, поскольку у вас идеальное совпадение!

внутри цикла for:

if(dist[i] == 0.) return values[i];
4 голосов
/ 02 февраля 2010

Я не вижу другого пути, кроме кусочного - вам нужна другая функция, чем обратное расстояние для небольших расстояний. Самое простое было бы просто отрубить верх:

modified_dist[i] = dist[i] < MIN_DIST ? MIN_DIST : dist[i]

но вы можете заменить это на что-то, что все еще уменьшается, если хотите, например (MIN_DIST + dist[i])/2.

3 голосов
/ 02 февраля 2010

Придумайте определения «доминирующий», «очень маленький» и «разберитесь с этим».Затем переведите их в код.

...