Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 加速矩阵运算_R_Rcpp - Fatal编程技术网

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
??)

关于更有效的建议

我考虑了以下几点:

  • Rcpp
    :从我的在线阅读资料来看,我相信R的rowMeans相当有效,所以不清楚它在这一步是否有帮助。我想确信瓶颈真正在哪里,也许我的整个设计都不太理想。如果大部分时间都花在为每个较小的矩阵制作副本上,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
,可以减少到1
rm@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)