我必须计算二维点的成对距离。这些点存储在矩阵中,第一列包含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
很陌生,所以也许我犯了一些明显的错误。