我有一个很大的输入矩阵(4000x10000)。我使用dist()来计算它的欧几里德距离矩阵(大约需要5个小时)。
我需要计算具有额外行的“相同”矩阵的距离矩阵(对于4001x10000矩阵)。确定距离矩阵而无需重新计算整个矩阵的最快方法是什么?
发布于 2012-12-02 20:14:59
我假设你的额外一行意味着额外的分数。如果它意味着额外的变量/维度,它将需要一个不同的答案。
首先,对于矩阵的欧几里得距离,我推荐使用fields包中的rdist函数。它是用Fortran编写的,比dist函数快得多。它返回一个matrix而不是一个dist对象,但是您总是可以使用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] TRUEhttps://stackoverflow.com/questions/13668675
复制相似问题