反距离加权插值

3
我希望计算一个权重,以距离的倒数为基础,类似于反距离加权插值
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个回答

6
如果存在零距离,就不需要插值,因为你已经有了完美的匹配!
在for循环内部:
if(dist[i] == 0.) return values[i];

5

除了分段函数,我没有看到其他的方法 - 对于小距离,您需要使用不同于倒数距离的函数。最简单的方法就是把顶部截断:

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

但是如果你愿意,你可以用仍然递减的其他值替换它,比如(MIN_DIST + dist[i])/2


+1:一个具体的解决方案。需要强调的是,选择完全是任意的。这个问题不能“客观地”回答。 - Daniel Daranas
1
是的,非常正确。 MIN_DIST 提供了很多灵活性,线性映射可以调整 - 一般形式为 (dist[i] - MIN_DIST) * k + MIN_DIST,其中 k < 1,但不要太小以至于 dist[i] = 0 映射到一个太小以至于无法除的值... - Cascabel
谢谢!如果在不知道问题上下文的情况下,我将MIN_DIST=DBL_EPSILON和MAX_DIST=1.0/DBL_EPSILON设置为合理吗? - Tim
1
我认为你应该更加谨慎 - 你需要在 1/distance 的所有后续操作中留有余地。最好还要了解上下文,大多数情况下,你可以对距离有一个相当好的想法,这样距离太小就无关紧要了。例如,当你处理汽车时用厘米足矣,何必使用皮米截止呢? - Cascabel

5

给出“dominant”、“very small”和“deal with it”的定义。然后将它们翻译成代码。


2
+1:我赞同通用解决方案。请查看我的答案以获取一个或两个示例。 - Cascabel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接