3

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

4

0 回答 0