重新计算距离矩阵

时间:2012-12-02 11:08:13

标签: r distance

我有一个大输入矩阵(4000x10000)。我使用dist()来计算它的欧几里德距离矩阵(大约需要5个小时) 我需要计算具有附加行的“相同”矩阵的距离矩阵(对于4001x10000矩阵)。在不重新计算整个矩阵的情况下确定距离矩阵的最快方法是什么?

1 个答案:

答案 0 :(得分:1)

我假设你的额外行意味着额外的一点。如果它意味着额外的变量/维度,它将需要一个不同的答案。

首先,对于欧氏距离的矩阵,我建议使用rdist包中的fields函数。它是用Fortran编写的,比dist函数快得多。它返回matrix而不是dist对象,但您始终可以使用as.matrixas.dist从一个对象转到另一个。

这里(小于你的)样本数据

num.points <- 400
num.vars   <- 1000
original.points <- matrix(runif(num.points * num.vars),
                          nrow = num.points, ncol = num.vars)

和你已经计算过的距离矩阵:

d0 <- rdist(original.points)

对于额外点,您只需计算额外点之间的距离以及额外点与原始点之间的距离。我将使用两个额外的点来表明解决方案对于任何数量的额外点都是通用的:

extra.points <- matrix(runif(2 * num.vars), nrow = 2)
inner.dist   <- rdist(extra.points)
outer.dist   <- rdist(extra.points, original.points)

所以你可以将它们绑定到更大的距离矩阵:

d1 <- rbind(cbind(d0, t(outer.dist)),
            cbind(outer.dist, inner.dist))

让我们检查它是否与完整的长期重新运行相匹配:

d2 <- rdist(rbind(original.points, extra.points))

identical(d1, d2)
# [1] TRUE