gpt4 book ai didi

algorithm - 将函数应用于 R 中的距离矩阵

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:35:56 25 4
gpt4 key购买 nike

这个问题今天出现在 manipulatr 邮件列表中。

http://groups.google.com/group/manipulatr/browse_thread/thread/fbab76945f7cba3f

我正在改写。

给定一个距离矩阵(用 dist 计算)对距离矩阵的行应用一个函数。

代码:

library(plyr)
N <- 100
a <- data.frame(b=1:N,c=runif(N))
d <- dist(a,diag=T,upper=T)
sumd <- adply(as.matrix(d),1,sum)

问题是,要按行应用该函数,您必须存储整个矩阵(而不仅仅是下三角部分。因此它对大矩阵使用了太多内存。它在我的计算机上无法处理维度为 ~ 10000 的矩阵.

有什么想法吗?

最佳答案

首先,对于那些还没有看过这个的人,我强烈推荐 reading this article on the r-wiki 关于代码优化。

这是另一个没有使用 ifelse 的版本(这是一个相对较慢的函数):

noeq.2 <- function(i, j, N) {
i <- i-1
j <- j-1
x <- i*(N-1) - (i-1)*((i-1) + 1)/2 + j - i
x2 <- j*(N-1) - (j-1)*((j-1) + 1)/2 + i - j
idx <- i < j
x[!idx] <- x2[!idx]
x[i==j] <- 0
x
}

还有我笔记本电脑上的计时:

> N <- 1000
> system.time(sapply(1:N, function(i) sapply(1:N, function(j) noeq(i, j, N))))
user system elapsed
51.31 0.10 52.06
> system.time(sapply(1:N, function(j) noeq.1(1:N, j, N)))
user system elapsed
2.47 0.02 2.67
> system.time(sapply(1:N, function(j) noeq.2(1:N, j, N)))
user system elapsed
0.88 0.01 1.12

并且 lapply 比 sapply 更快:

> system.time(do.call("rbind",lapply(1:N, function(j) noeq.2(1:N, j, N))))
user system elapsed
0.67 0.00 0.67

关于algorithm - 将函数应用于 R 中的距离矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1692336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com