[英]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次,並且m
和C
也可能非常大。 因此,我想做的是能夠在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中的代碼:
正如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.