我有一个很大的输入矩阵(4000x10000)。我dist()
用来计算它的欧几里得距离矩阵(大约需要 5 个小时)。
我需要计算带有附加行的“相同”矩阵的距离矩阵(对于 4001x10000 矩阵)。在不重新计算整个矩阵的情况下确定距离矩阵的最快方法是什么?
问问题
1170 次
1 回答
2
我会假设你的额外行意味着额外的点。如果这意味着一个额外的变量/维度,它将需要一个不同的答案。
首先,对于矩阵的欧几里德距离,我推荐包中的rdist
函数fields
。它是用 Fortran 编写的,比dist
函数快得多。它返回 amatrix
而不是对象,但您始终可以使用anddist
从一个对象转到另一个对象。as.matrix
as.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
于 2012-12-02T12:14:59.127 回答