R 加速矩阵运算
考虑以下矩阵R 加速矩阵运算,r,rcpp,R,Rcpp,考虑以下矩阵 nc <- 5000 nr <- 1024 m <- matrix(rnorm(nc*nr), ncol=nc) 它相当慢,不幸的是我不理解Rprof的输出(似乎大部分时间都花在is.data.frame??) 关于更有效的建议 我考虑了以下几点: Rcpp:从我的在线阅读资料来看,我相信R的rowMeans相当有效,所以不清楚它在这一步是否有帮助。我想确信瓶颈真正在哪里,也许我的整个设计都不太理想。如果大部分时间都花在为每个较小的矩阵制作副本上,Rcpp的性
nc <- 5000
nr <- 1024
m <- matrix(rnorm(nc*nr), ncol=nc)
它相当慢,不幸的是我不理解Rprof的输出(似乎大部分时间都花在is.data.frame
??)
关于更有效的建议
我考虑了以下几点:
:从我的在线阅读资料来看,我相信R的rowMeans相当有效,所以不清楚它在这一步是否有帮助。我想确信瓶颈真正在哪里,也许我的整个设计都不太理想。如果大部分时间都花在为每个较小的矩阵制作副本上,Rcpp的性能会更好吗Rcpp
- 更新到R-devel后,似乎有一个新的
函数更高效。有人试过吗.rowMeans
谢谢。您不需要两次呼叫
rowMeans
。您可以先进行减法运算,然后对结果调用rowMeans
x1 <- rowMeans(m[,ind1])-rowMeans(m[,ind2])
x2 <- rowMeans(m[,ind1]-m[,ind2])
all.equal(x1,x2)
# [1] TRUE
在您的例子中,m=1024
和n=1000
对m
中的列子集进行的每个rowSums()
调用可以看作是m
与表示所选列的0
或1
向量之间的矩阵乘法。如果将所有这些向量并置,最终将得到两个矩阵之间的乘法(效率更高):
ind1如果你在犰狳身上做采样、子集和差异,我怀疑你会有所收获。应该足够快通过RcppArmadillo进行尝试,不是吗?这将是相当容易的,是的,但希望我可以使用纯R。基本上,当/如果所有R方法都失败时,我会尝试。另外,我没有在Rcpp中管理随机数的经验。Rcpp sugar提供了R使用的相同流:-)事实上,这比你说的还要好,因为OP有200个调用(2*100个重复)到rowMeans
,可以减少到1rm@Joshua,你确定计算两个矩阵的差不会像计算其中一个矩阵的平均值那样昂贵吗?“毕竟操作的次数是一样的。”本博克说。我最初的猜测是行意味着(m)
可以存储在replicate
调用之外,但它并不能解决同样的问题。OP的输出为1024×10;你和我都认为会是1000乘10…@flodel:我的想法是这样可以节省额外的函数调用,避免调用is.data.frame
,但是计时似乎不能证明这一点…@BenBolker我不知道这是怎么回事。我想计算从原始矩阵的列中选择的子矩阵的rowMeans
。如果我采用rowMeans(m)
所有列都有效地折叠为1。这听起来很有希望,谢谢!我需要让自己相信它做的是正确的,但它肯定是快速而优雅的。
x1 <- rowMeans(m[,ind1])-rowMeans(m[,ind2])
x2 <- rowMeans(m[,ind1]-m[,ind2])
all.equal(x1,x2)
# [1] TRUE
.rowMeans <- function(X, m, n, na.rm = FALSE)
.Internal(rowMeans(X, m, n, na.rm))
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)