4

考虑以下矩阵,

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更有效的新功能。有人试过吗?

谢谢。

4

2 回答 2

7

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

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)
于 2012-02-28T02:15:53.673 回答
4

您不需要 2 次调用rowMeans. 您可以先进行减法并调用rowMeans结果。

x1 <- rowMeans(m[,ind1])-rowMeans(m[,ind2])
x2 <- rowMeans(m[,ind1]-m[,ind2])
all.equal(x1,x2)
# [1] TRUE

is.data.frame是在 中完成的检查的一部分rowMeans

更新:.rowMeans在 R-devel 中,它看起来只是对内部代码的直接调用(假设do_colsum没有改变)。它定义为:

.rowMeans <- function(X, m, n, na.rm = FALSE)
    .Internal(rowMeans(X, m, n, na.rm))

在你的情况下,m=1024n=1000

于 2012-02-28T01:19:33.813 回答