【问题标题】:Fast big matrix generation快速大矩阵生成
【发布时间】:2014-07-09 15:04:34
【问题描述】:

我想生成一个大矩阵 mat=matrix(, nrow=1e6, ncol=1e4)mat 的值被分配为mat[,1] = 1:1e6。对于列cols in 2:1e4mat[,cols] = mat[,1] + shift[cols],其中shift是一个数值向量,例如shift = runif( 1e4 )

有很多方法可以做到这一点。问题是,这是另一个函数中经常被调用的部分。如果这部分效率低下,计算时间将大大增加。任何人有好的建议如何实现这一目标?

【问题讨论】:

  • 查看bigmemory 中的big.matrix() 是否适合您
  • 你尝试了哪些方法?我认为sweep 非常高效,类似于sweep(m, 2, shift, '+')
  • 我认为有一个使用 outer 的解决方案,因为 outer 可以使用任何用户定义的函数来创建输出数据。让我想想……

标签: r performance matrix


【解决方案1】:

这个怎么样:

frist<-1:10
addto<-runif(5)
outer(frist,addto,'+')

现在是计时赛:

frist<-1:1e5
addto<-runif(1e3)

carl<-function(frist,addto)  outer(frist,addto,'+')

konvas<-function(frist,addto) {
fristmat<-matrix(rep(frist,times=length(addto)),nr=length(frist))
sweep(fristmat, 2, addto, '+') 
}

microbenchmark(carl(frist,addto),konvas(frist,addto),times=5)
Unit: seconds
                 expr      min       lq   median      uq
   carl(frist, addto) 1.046612 1.052813 1.053038 1.05717
 konvas(frist, addto) 7.265776 7.302062 7.328859 7.35135
      max neval
 1.344122     5
 7.366162     5

【讨论】:

    猜你喜欢
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2015-10-11
    • 2017-01-25
    相关资源
    最近更新 更多