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

作者: kolun (...)   2014-07-07 14:34:09
我有一個模型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) {...}的時間實在太久了
我知道我現在的作法應該是最慢的
想請教版上的各位大大有什麼方法可以提升速度呢?
謝謝各位
作者: celestialgod (天)   2014-07-07 18:40:00
沒有詳細的設定,只能給點簡單的建議記憶足夠下可以改成用parallel還要更快就是寫Rcpp另外,避免迴圈 可以減少不少的時間在複製上面
作者: kolun (...)   2014-07-07 19:17:00
我想請問像第二層迴圈這樣的運算在R裡要怎樣避免呢?我試過apply但我發現沒有比較快 在matlab裡可以用bsxfun加速
作者: celestialgod (天)   2014-07-07 19:55:00
我不知道如何避免第二個迴圈
作者: clickhere (It's time to go home.)   2014-07-07 22:57:00
do.call("cbind",lapply(1:nsim,function(n.path){as.matrix(B[,m]) %*% Fsim[n.path,]}) 可取代第2層.沒必要先宣告Z.
作者: Wush978 (拒看低質媒體)   2014-07-08 03:45:00
如果是linux or mac, 可以更換BLAS,矩陣乘法會快很多

Links booklink

Contact Us: admin [ a t ] ucptt.com