[問題] 加速模擬時的矩陣相乘

看板R_Language作者 (...)時間10年前 (2014/07/07 14:34), 10年前編輯推噓0(0011)
留言11則, 4人參與, 最新討論串1/2 (看更多)
我有一個模型Y = BF 其中B是N x M, F是M x T的矩陣 我要透過模擬F的變化10000次再組合回去得到模擬的Y 但速度非常慢 我現在的作法是 # data M = 3 N = 500 T = 100 nSim = 10000 B = matrix(rnorm(N * M), nrow = N) F = matrix(rnorm(M * T), nrow = M) sigma = abs(rnorm(M)) Z = array(0, dim = c(M, nSim, N, T)) # preallocate for (m in 1:M) { eps = rnorm(nSim * T, 0, sigma[m]) #generate random normal dim(eps) = c(nSim, T) # 變成 10000 x T Fsim = F[m, ] + eps for (n.path in 1:nSim) { Z[m,n.path,,] = as.matrix(B[,m]) %*% Fsim[n.path,] } } result = apply(Z, c(2,3,4), sum) 其中第一步allocation就要大概3秒 (on macbook air 2013 mid) 產生亂數的時間好像還在預期中 但是裡面這個for (npath in 1:10000) {...}的時間實在太久了 我知道我現在的作法應該是最慢的 想請教版上的各位大大有什麼方法可以提升速度呢? 謝謝各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.163.241 ※ 文章網址: http://www.ptt.cc/bbs/R_Language/M.1404714852.A.D01.html

07/07 18:40, , 1F
沒有詳細的設定,只能給點簡單的建議
07/07 18:40, 1F

07/07 18:40, , 2F
記憶足夠下可以改成用parallel
07/07 18:40, 2F

07/07 18:41, , 3F
還要更快就是寫Rcpp
07/07 18:41, 3F

07/07 18:42, , 4F
另外,避免迴圈 可以減少不少的時間在複製上面
07/07 18:42, 4F
※ 編輯: kolun (123.195.163.241), 07/07/2014 18:58:29

07/07 19:17, , 5F
我想請問像第二層迴圈這樣的運算在R裡要怎樣避免呢?
07/07 19:17, 5F

07/07 19:18, , 6F
我試過apply但我發現沒有比較快 在matlab裡可以用bsxfun加速
07/07 19:18, 6F

07/07 19:55, , 7F
我不知道如何避免第二個迴圈
07/07 19:55, 7F

07/07 22:57, , 8F
do.call("cbind",lapply(1:nsim,function(n.path){
07/07 22:57, 8F

07/07 22:58, , 9F
as.matrix(B[,m]) %*% Fsim[n.path,]}) 可取代第2層.
07/07 22:58, 9F

07/07 22:59, , 10F
沒必要先宣告Z.
07/07 22:59, 10F

07/08 03:45, , 11F
如果是linux or mac, 可以更換BLAS,矩陣乘法會快很多
07/08 03:45, 11F
文章代碼(AID): #1JkZzaq1 (R_Language)
文章代碼(AID): #1JkZzaq1 (R_Language)