我必须计算二维点的成对距离。这些点存储在一个矩阵中,第一列包含 x 值,第二列包含 y 值。我需要的距离函数不是欧几里得度量,而是一些自定义度量。
对于欧几里得距离,使用包中的rdist()
函数fields
会给我想要的东西:
require(fields)
a = matrix(c(0,7,3,2,0,8,2,8), nrow=4)
b = matrix(c(2,6,2,6,2,2,6,6), nrow=4)
rdist(a,b)
[,1] [,2] [,3] [,4]
[1,] 2.828427 6.324555 6.324555 8.485281
[2,] 7.810250 6.082763 5.385165 2.236068
[3,] 1.000000 3.000000 4.123106 5.000000
[4,] 6.000000 7.211103 2.000000 4.472136
为了使用我自己的度量,我编写了一个简单的rdist()
替换来计算点的距离:
my_rdist <- function(a, b) {
a_len = dim(a)[1]
b_len = dim(b)[1]
distmatrix = matrix(data=NA, nrow=a_len, ncol=b_len)
for(i in seq(1,a_len)) {
for(j in seq(1,b_len)) {
distmatrix[i,j] = my_distance( a[i,], b[j,] )
}
}
return(distmatrix)
}
这也可以按预期工作,但速度非常慢。该my_rdist()
功能大约需要 20 分钟,而包中的rdist()
功能fields
需要不到 2 秒。(目前的自定义指标只是计算欧几里得距离的平方。这个想法是在我的数据集的以下处理中惩罚更大的距离。)
rdist()
有没有我不知道可以处理自定义指标函数的替代品?或者你能给我一些提示来加快我的my_rdist()
功能吗?我很新,R
所以也许我犯了一些明显的错误。