作者kolun (...)
看板R_Language
标题[问题]加速模拟时的矩阵相乘
时间Mon Jul 7 14:34:09 2014
我有一个模型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://webptt.com/cn.aspx?n=bbs/R_Language/M.1404714852.A.D01.html
1F:→ celestialgod:没有详细的设定,只能给点简单的建议 07/07 18:40
2F:→ celestialgod:记忆足够下可以改成用parallel 07/07 18:40
3F:→ celestialgod:还要更快就是写Rcpp 07/07 18:41
4F:→ celestialgod:另外,避免回圈 可以减少不少的时间在复制上面 07/07 18:42
※ 编辑: kolun (123.195.163.241), 07/07/2014 18:58:29
5F:→ kolun:我想请问像第二层回圈这样的运算在R里要怎样避免呢? 07/07 19:17
6F:→ kolun:我试过apply但我发现没有比较快 在matlab里可以用bsxfun加速 07/07 19:18
7F:→ celestialgod:我不知道如何避免第二个回圈 07/07 19:55
8F:→ clickhere:do.call("cbind",lapply(1:nsim,function(n.path){ 07/07 22:57
9F:→ clickhere:as.matrix(B[,m]) %*% Fsim[n.path,]}) 可取代第2层. 07/07 22:58
10F:→ clickhere:没必要先宣告Z. 07/07 22:59
11F:→ Wush978:如果是linux or mac, 可以更换BLAS,矩阵乘法会快很多 07/08 03:45