R中的快速rdist替换接受自定义距离度量

时间:2014-05-23 17:55:23

标签: r field metric

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

0 个答案:

没有答案