使用Matrix的值作为行索引在R中另一个矩阵中查找值的最有效方法

时间:2018-11-21 11:21:10

标签: r matrix

我反复从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]

}

1 个答案:

答案 0 :(得分:2)

您可以通过逐列计算来加快速度:

for (i in 1:18) X[, i] <- Marginals[U[, i], i]

最终,以下代码等同于您的代码:

X <- replicate(18, sample(runif(500), repl=TRUE))

(这不会比我的第一个变体快很多,但是代码更紧凑)