gpt4 book ai didi

r - 在 R 中建立稀疏矩阵的更快方法?

转载 作者:行者123 更新时间:2023-12-04 11:36:22 26 4
gpt4 key购买 nike

我正在尝试在 R 中设置一种特定类型的稀疏矩阵。以下代码给出了我想要的结果,但速度非常慢:

library(Matrix)

f <- function(x){

out <- rbind(head(x, -1), tail(x, -1))
out <- bdiag(split(out, col(out)))
return(out)

}#END f

x <- outer(1:250, (1:5)/10, '+')
do.call(rBind, apply(x, 1, f))

在我正在进行的模拟研究中,我需要这样做数千次,所以这是一个非常严重的瓶颈。在这种情况下,Rprof() 输出非常困惑。我很感激您对如何加快速度提出的任何建议。

感谢您的时间。

最佳答案

这段代码运行得更快(<0.01 秒,而我的机器上是 3.36 秒),因为它避免了所有这些极其缓慢的 rBind 'ing。关键是首先准备非零单元格的行索引、列索引和值。调用sparseMatrix(i,j,x)然后将构造稀疏矩阵,甚至不需要调用 rBind() .

library(Matrix)
A <- 1:250
B <- (1:5)/10
x <- outer(A, B, '+')

f2 <- function(x){
n <- length(x)
rep(x, each=2)[-c(1, 2*n)]
}

system.time({
val <- as.vector(apply(x,1,f2))
n <- length(val)
i <- seq_len(n)
j <- rep(rep(seq_len(length(B)-1), each=2), length.out=n)
outVectorized <- sparseMatrix(i = i, j = j, x = val)
})
# user system elapsed
# 0 0 0

只是为了表明结果是相同的:
## Your approach
f <- function(x){
out <- rbind(head(x, -1), tail(x, -1))
out <- bdiag(split(out, col(out)))
return(out)
}

system.time(outRBinded <- do.call(rBind, apply(x, 1, f)))
# user system elapsed
# 3.36 0.00 3.36

identical(outVectorized, outRBinded)
# [1] TRUE

关于r - 在 R 中建立稀疏矩阵的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10822150/

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