关于R包fields中rdist.earth函数非零对角元距离矩阵的疑问
让我来逐个解答你的两个问题:
问题1:为何第二列条目显示的小数位数多于另外两列?
这其实是R的数值显示机制在起作用:
- 当数值是严格的0时,R会默认用更简洁的小数位格式展示(比如这里的
0.0000000),避免不必要的冗余。 - 但当遇到一个非常小的非零值时,R会自动调整该列的显示精度,展示足够多的小数位来明确区分这个值和真正的0——毕竟
0.000059058368虽然极小,但确实不是0。 - 另外矩阵的打印逻辑会尽量统一整列的格式,所以当某一列里有需要更多小数位才能完整呈现的数值时,整列都会采用这个精度,这就导致第二列的小数位数比另外两列多。
问题2:为何该对角元不为0?
这个问题的核心是浮点数精度误差,结合rdist.earth()的计算逻辑来看:
- 理论上同一个点到自身的球面距离肯定是0,但
rdist.earth()是基于经纬度的浮点数值进行计算的。计算机存储浮点数(比如R里的double类型)时,无法完全精确表示所有十进制小数,会存在极其微小的精度损失。 - 当计算自身距离时,虽然输入的是同一个点,但在底层公式运算中,可能因为浮点数的微小偏差,最终输出一个接近0但非零的极小值。
- 另一种可能是你输入的第二个点的经纬度数据,在存储或输入时存在极细微的差异(比如小数点后第10位之后的不同),看起来是同一个点,但实际数值有微小区别,这也会让计算出的距离不是严格的0。
如果想要彻底解决这个问题,可以在计算后手动将对角元强制设为0,代码示例:
# 假设你的距离矩阵是dist_matrix dist_matrix <- rdist.earth(your_coordinate_data) diag(dist_matrix) <- 0
内容的提问来源于stack exchange,提问作者someguyinafloppyhat
相关产品推荐
相关产品推荐

