2014-07-09 181 views
0

我想生成一個大矩陣mat = matrix(, nrow=1e6, ncol=1e4)mat的值分配爲mat[,1] = 1:1e6。對於列cols in 2:1e4,mat[,cols] = mat[,1] + shift[cols],其中shift是數值向量,例如對於shift = runif(1e4)快速大矩陣生成

有很多方法可以做到這一點。問題在於,這是另一個功能中經常被稱爲的一部分。如果這部分效率低下,計算時間將大大增加。任何人有很好的建議如何實現這一目標?

+1

看看'big.matrix()''中工作bigmemory'你 – Vlo

+0

你嘗試過什麼辦法呢?我認爲'sweep'非常高效,像'sweep'(m,2,shift,'+')'。 – konvas

+0

我認爲有一個使用'outer'的解決方案,因爲'outer'可以使用任何用戶定義的函數來創建輸出數據。讓我想起... –

回答

0

如何:

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