首页 > 解决方案 > 使用 Matrix 的值作为行索引以在 R 中的另一个矩阵中查找值的最有效方法

问题描述

我从蒙特卡洛模拟中反复绘制具有随机值的大型矩阵。当我探索一个大的参数空间时,模拟很可能会运行几天,因此我试图找到最有效的方法来尽可能多地减少时间。考虑以下带有 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]

}

标签: rmatrix

解决方案


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

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

最终,以下内容等效于您的代码:

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

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


推荐阅读