加快矩阵rowMeans操作

时间:2012-02-28 00:48:48

标签: r rcpp

考虑以下矩阵,

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

感谢。

2 个答案:

答案 0 :(得分:7)

对来自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)

答案 1 :(得分:4)

您不需要拨打rowMeans两次电话。您可以先进行减法,然后在结果上调用rowMeans

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

is.data.framerowMeans中完成的检查的一部分。

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

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

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