我反复从Monte Carlo Simulation中绘制具有随机值的大型矩阵。当我探索较大的参数空间时,该模拟很可能会运行几天,因此,我正在尝试找到最有效的方法来节省尽可能多的时间。考虑下面的代码,以500x18矩阵为例。
U = matrix(sample.int(500, size = 500*18, replace = TRUE), nrow = 500, ncol = 18)
X = matrix(nrow= 500, ncol = 18)
Marginals = matrix(runif(500*18, min = 0, max = 1),500,18)
for (i in 1:18){
for (k in 1:500){
X[k,i] = Marginals[U[k,i],i]
}
}
U中随机抽取的值用作行索引,而col索引由相应U的列提供。
我知道循环通常不会R消失,有没有一种更有效的使用方法,例如apply
在这里?
通过Yogos Suggesiton,最有效的代码可以在没有k循环的情况下生成:
U = matrix(sample.int(500, size = 500*18, replace = TRUE), nrow = 500, ncol = 18)
X = matrix(nrow= 500, ncol = 18)
Marginals = matrix(runif(500*18, min = 0, max = 1),500,18)
for (i in 1:18){
X[, i] <- Marginals[U[, i], i]
}
答案 0 :(得分:2)
您可以通过逐列计算来加快速度:
for (i in 1:18) X[, i] <- Marginals[U[, i], i]
最终,以下代码等同于您的代码:
X <- replicate(18, sample(runif(500), repl=TRUE))
(这不会比我的第一个变体快很多,但是代码更紧凑)