考虑以下矩阵,
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
功能更高效。有人试过吗?
感谢。
答案 0 :(得分:7)
对来自rowSums()
的列子集的每次m
调用都可视为m
与0
或1
向量之间的矩阵乘法选定的列。如果你并置所有这些向量,你最终会得到两个矩阵之间的乘法(效率更高):
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.frame
是rowMeans
中完成的检查的一部分。
更新:关于R-devel中的.rowMeans
,看起来它只是对内部代码的直接调用(假设do_colsum
没有改变)。它被定义为:
.rowMeans <- function(X, m, n, na.rm = FALSE)
.Internal(rowMeans(X, m, n, na.rm))
在您的情况下,m=1024
和n=1000
。