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颜色

在 R 中计算 big.matrix 的行总和?

向vb 高手求助代码编程:菜单中打开txt或excel数据表文件,求某列中几个数求平均,找出并输出均值附近数据

如何释放崩溃 R 会话的 big.matrix 对象使用的内存

计算 R 中 big.matrix 的对角线

等效于 R 中 big.matrix 的 row() 和 col()