如何编写R函数输入坐标向量生成两两区域欧氏距离矩阵并修复报错
原代码错误梳理
- 距离计算逻辑
D = sqrt(...)放在循环外部,此时循环变量i、j未定义,计算结果无效 - R语言矩阵索引规则为
矩阵名[行号,列号],原代码用A[i][j]属于语法错误,导致赋值失败 - 平方运算结果本身为非负值,不需要额外加
abs()函数 - 先给D赋值再初始化矩阵、提前给i/j赋值为行列数的操作完全冗余,逻辑顺序颠倒
修正后的自定义函数代码
x = c(1,2,4,1,1) y = c(4,3,1,2,2) Distance = function(x,y){ # 自动获取坐标点数量,不用硬编码为5 n = length(x) # 初始化全0距离矩阵 A = matrix(0, nrow = n, ncol = n) # 双层循环计算每对坐标的距离 for (i in 1:n){ for (j in 1:n){ A[i,j] = sqrt((x[i] - x[j])^2 + (y[i] - y[j])^2) } } return(A) } # 调用函数输出结果 Distance(x,y)
更高效的内置函数实现
如果不需要手动实现循环逻辑,R自带的dist()函数可以直接计算欧氏距离,一行代码就能得到符合要求的结果:
# 把坐标合并为矩阵,直接计算距离并转为矩阵格式 as.matrix(dist(cbind(x,y)))
两种实现方式输出的结果完全一致,对角线元素均为0,是符合要求的对称距离矩阵。
内容的提问来源于stack exchange,提问作者youfacejaraxxus
相关产品推荐
相关产品推荐

