首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新计算距离矩阵

重新计算距离矩阵
EN

Stack Overflow用户
提问于 2012-12-02 19:08:13
回答 1查看 1.2K关注 0票数 0

我有一个很大的输入矩阵(4000x10000)。我使用dist()来计算它的欧几里德距离矩阵(大约需要5个小时)。

我需要计算具有额外行的“相同”矩阵的距离矩阵(对于4001x10000矩阵)。确定距离矩阵而无需重新计算整个矩阵的最快方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-02 20:14:59

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

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

以下是(比您的小)示例数据

代码语言:javascript
复制
num.points <- 400
num.vars   <- 1000
original.points <- matrix(runif(num.points * num.vars),
                          nrow = num.points, ncol = num.vars)

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

代码语言:javascript
复制
d0 <- rdist(original.points)

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

代码语言:javascript
复制
extra.points <- matrix(runif(2 * num.vars), nrow = 2)
inner.dist   <- rdist(extra.points)
outer.dist   <- rdist(extra.points, original.points)

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

代码语言:javascript
复制
d1 <- rbind(cbind(d0, t(outer.dist)),
            cbind(outer.dist, inner.dist))

让我们检查它是否与完整、长时间的重新运行所产生的结果相匹配:

代码语言:javascript
复制
d2 <- rdist(rbind(original.points, extra.points))

identical(d1, d2)
# [1] TRUE
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13668675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档