R中几个big.matrix对象的元素平均值
Posted
技术标签:
【中文标题】R中几个big.matrix对象的元素平均值【英文标题】:Element-wise mean of several big.matrix objects in R 【发布时间】:2018-08-28 00:25:09 【问题描述】:我有 17 个文件支持的 big.matrix 对象(尺寸为 10985 x 52598,每个 4.3GB),我想计算其中的元素平均值。结果可以存储在另一个 big.matrix (gcm.res.outputM) 中。
biganalytics::apply() 不起作用,因为 MARGIN 只能设置为 1 或 2。我尝试使用 2 个 for 循环,如下所示
gcm.res.outputM <- filebacked.big.matrix(10958, 52598, separated = FALSE, backingfile = "gcm.res.outputM.bin", backingpath = NULL, descriptorfile = "gcm.res.outputM.desc", binarydescriptor = FALSE)
for(i in 1:10958)
for(j in 1:52598)
t <- rbind(gcm.res.output1[i,j], gcm.res.output2[i,j],gcm.res.output3[i,j], gcm.res.output4[i,j],
gcm.res.output5[i,j], gcm.res.output6[i,j],gcm.res.output7[i,j], gcm.res.output8[i,j],
gcm.res.output9[i,j], gcm.res.output10[i,j],gcm.res.output11[i,j], gcm.res.output12[i,j],
gcm.res.output13[i,j], gcm.res.output14[i,j],gcm.res.output15[i,j], gcm.res.output16[i,j],
gcm.res.output17[i,j])
tM <- apply(t, 2, mean, na.rm = TRUE)
gcm.res.outputM[i,j] <- tM
每行 i 大约需要 1.5 分钟,因此运行大约 11 天。
有人对如何加快计算速度有任何想法吗?我正在使用具有 16GB RAM 的 64x Windows10 机器。
谢谢!
【问题讨论】:
看看这个winvector.github.io/Accumulation。使用data.table
包可能会有所帮助
有很多方法可以做到这一点。您可以在 Rcpp 中实现它,或者对所有矩阵的列块使用 R 函数,或者将矩阵一一相加。这些解决方案是在易于实施、速度有多快和使用多少内存之间进行权衡。你有多少内存?
感谢您的 cmets。 @F Privé,我有 16GB 的 RAM。使用 big.matrix 对象的优点是我不必将整个矩阵直接加载到 RAM 中。我能做的是在当时对整行值进行上述计算,从而摆脱第二个 for 循环。如果您有更多建议,我很乐意听到!
【参考方案1】:
您可以使用此 Rcpp 代码:
// [[Rcpp::depends(BH, bigmemory, RcppEigen)]]
#include <bigmemory/MatrixAccessor.hpp>
#include <RcppEigen.h>
using namespace Eigen;
using namespace Rcpp;
// [[Rcpp::export]]
void add_to(XPtr<BigMatrix> xptr_from, XPtr<BigMatrix> xptr_to)
Map<MatrixXd> bm_from((double *)xptr_from->matrix(),
xptr_from->nrow(), xptr_from->ncol());
Map<MatrixXd> bm_to((double *)xptr_to->matrix(),
xptr_to->nrow(), xptr_to->ncol());
bm_to += bm_from;
// [[Rcpp::export]]
void div_by(XPtr<BigMatrix> xptr, double val)
Map<MatrixXd> bm((double *)xptr->matrix(),
xptr->nrow(), xptr->ncol());
bm /= val;
如果你有一个大小相同的 big.matrix 对象列表,你可以这样做:
library(bigmemory)
bm_list <- lapply(1:5, function(i) big.matrix(1000, 500, init = i))
res <- deepcopy(bm_list[[1]])
lapply(bm_list[-1], function(bm) add_to(bm@address, res@address))
res[1:5, 1:5] # verif
div_by(res@address, length(bm_list))
res[1:5, 1:5] # verif
【讨论】:
上面的代码确实很有帮助,但是当存在 NA 值时我很难使用它。我可以在 Rcpp 中包含类似于“na.rm = TRUE”的内容吗? 我认为您将无法使用(或调整)缺少值的代码。请针对您的新问题提出另一个问题。以上是关于R中几个big.matrix对象的元素平均值的主要内容,如果未能解决你的问题,请参考以下文章
使用开放CV和python提取或获取图像中几个点的平均RGB颜色
向vb 高手求助代码编程:菜单中打开txt或excel数据表文件,求某列中几个数求平均,找出并输出均值附近数据