簡體   English   中英

壓縮R中的for循環

[英]Condensing a for-loop in R

我在R有以下代碼

library(mvtnorm)

m = matrix(rnorm(2000000),nrow=200)
A = matrix(rnorm(40000),ncol=200)
A = A%*%t(A)
C = array(A,c(200,200,10000))

B = 10000
S = 100

postpred = array(NA,c(200,S,B))
for(i in 1:B){
    postpred[,,i] = t(rmvnorm(S,m[,i],C[,,i],method="svd"))
}

但是這段代碼非常慢,因為我必須循環10,000次,同時還要從多元正態模擬100次,並且mC也可能非常大。 因此,我想做的是能夠在postpred外部計算postpred 我試過使用apply函數,但無濟於事。 任何幫助或建議,不勝感激。

其他人指出, 應用 (和類似功能)對您的情況沒有多大幫助,它們是正確的。

對於它的價值,我檢查了通過編譯代碼是否可以提高性能。 這是我針對您的問題做的一些基准測試(我減小了矩陣的大小,因為否則我將無法運行它們):

library(mvtnorm)

func = function()
{ 
  m = matrix(rnorm(200000),nrow=100)
  A = matrix(rnorm(10000),ncol=100)
  A = A%*%t(A)
  C = array(A,c(100,100,1000))

  B = 1000
  S = 10

  postpred = array(NA,c(1000,S,B))
  for(i in 1:B){
    postpred[,,i] = t(rmvnorm(S,m[,i],C[,,i],method="svd"))
  }
}

require(compiler)
func_compiled <- cmpfun(func)

require(microbenchmark)

microbenchmark(func_compiled(), func(), times=10) # grab a coffee, this takes some time

結果表明,編譯不會給您帶來任何好處:

Unit: seconds
                 expr      min       lq   median       uq      max neval
 slow_func_compiled() 9.938632 10.12269 10.18237 10.48215 15.43299    10
          slow_func() 9.969320 10.07676 10.21916 15.44664 15.66109    10

(這本來可以預料的,因為應該已經編譯了庫mvtnorm

總體而言,您只剩下兩種方法可以優化R中的代碼:

  1. 使用較小的數字(如果可以)
  2. 並行化您的代碼

正如Josillber所說,向 量化 應用函數族 )不會為您做很多事情,這確實是一個R神話,它可以顯着提高速度。

建議您看一下並行選項,其中有並行mcapply和snow軟件包。 在此處閱讀更多信息http://stat.ethz.ch/R-manual/R-devel/library/parallel/doc/parallel.pdf

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM