gpt4 book ai didi

R:摆脱 for 循环和加速代码

转载 作者:行者123 更新时间:2023-12-04 14:55:54 29 4
gpt4 key购买 nike

我想在不使用函数 m 中的循环的情况下加快计算并获得结果.可重现的例子:

N <- 2500
n <- 500
r <- replicate(1000, sample(N, n))

m <- function(r, N) {
ic <- matrix(0, nrow = N, ncol = N)
for (i in 1:ncol(r)) {
p <- r[, i]
ic[p, p] <- ic[p, p] + 1
}
ic
}

system.time(ic <- m(r, N))
# user system elapsed
# 6.25 0.51 6.76
isSymmetric(ic)
# [1] TRUE

for 的每次迭代中循环我们正在处理矩阵而不是向量,那么如何将其向量化?

@joel.wilson 这个函数的目的是计算元素的成对频率。所以之后我们可以估计成对包含概率。

感谢@Khashaa 和@alexis_laz。基准:
> require(rbenchmark)
> benchmark(m(r, N),
+ m1(r, N),
+ mvec(r, N),
+ alexis(r, N),
+ replications = 10, order = "elapsed")
test replications elapsed relative user.self sys.self user.child sys.child
4 alexis(r, N) 10 4.73 1.000 4.63 0.11 NA NA
3 mvec(r, N) 10 5.36 1.133 5.18 0.18 NA NA
2 m1(r, N) 10 5.48 1.159 5.29 0.19 NA NA
1 m(r, N) 10 61.41 12.983 60.43 0.90 NA NA

最佳答案

这应该快得多,因为它避免了双索引操作

m1 <- function(r, N) {
ic <- matrix(0, nrow = N, ncol=ncol(r))
for (i in 1:ncol(r)) {
p <- r[, i]
ic[, i][p] <- 1
}
tcrossprod(ic)
}

system.time(ic1 <- m1(r, N))
# user system elapsed
# 0.53 0.01 0.55

all.equal(ic, ic1)
# [1] TRUE

简单的“计数/加法”操作几乎总能被向量化
mvec <- function(r, N) {
ic <- matrix(0, nrow = N, ncol=ncol(r))
i <- rep(1:ncol(r), each=nrow(r))
ic[cbind(as.vector(r), i)] <- 1
tcrossprod(ic)
}

关于R:摆脱 for 循环和加速代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40863125/

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