gpt4 book ai didi

r - 加速矩阵 rowMeans 操作

转载 作者:行者123 更新时间:2023-12-04 22:34:56 27 4
gpt4 key购买 nike

考虑以下矩阵,

nc <- 5000
nr <- 1024
m <- matrix(rnorm(nc*nr), ncol=nc)

我想在这个矩阵中随机取两组相同大小的 rowMeans 之间的差异。
n <- 1000 # group size

system.time(replicate(100, {
ind1 <- sample(seq.int(nc), n)
ind2 <- sample(seq.int(nc), n)
rowMeans(m[, ind1]) - rowMeans(m[, ind2])
}))

它很慢,不幸的是我不明白 Rprof 的输出(似乎大部分时间都花在了 is.data.frame 上??)

对更有效的东西的建议?

我考虑了以下几点:
  • Rcpp :从我的在线阅读来看,我相信 R 的 rowMeans 非常有效,所以不清楚它对这一步是否有帮助。我想确信真正的瓶颈在哪里,也许我的整个设计不是最理想的。如果大部分时间都花在为每个较小的矩阵制作副本上,那么 Rcpp 的性能会更好吗?
  • 更新到 R-devel,似乎有一个新的 .rowMeans 函数更有效。有没有人试过?

  • 谢谢。

    最佳答案

    对来自 rowSums() 的列子集的每个 m 调用都可以看作是 m01 的向量之间的矩阵乘法,该向量指示所选列。如果将所有这些向量并置,最终会得到两个矩阵之间的乘法(效率更高):

    ind1 <- replicate(100, seq.int(nc) %in% sample(seq.int(nc), n)) 
    ind2 <- replicate(100, seq.int(nc) %in% sample(seq.int(nc), n))
    output <- m %*% (ind1 - ind2)

    关于r - 加速矩阵 rowMeans 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9474765/

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