2 votes

La manière la plus efficace d'utiliser les valeurs d'une matrice comme indices de rangée pour rechercher des valeurs dans une autre matrice en R

Je dessine de manière répétée de grandes matrices avec des valeurs aléatoires à partir d'une simulation de Monte Carlo. Comme j'explore un large espace de paramètres, la simulation se déroulera très probablement sur plusieurs jours. J'essaie donc de trouver le moyen le plus efficace de gagner le plus de temps possible. Considérons le code suivant avec une matrice de 500x18 comme exemple.

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]

  }  
}

Les valeurs tirées au hasard dans U servent d'indice de ligne, tandis que l'indice de colonne est fourni par la colonne de U respective.

Je sais que les boucles ne sont généralement pas le meilleur moyen de s'en sortir, mais existe-t-il un moyen plus efficace d'utiliser par ex. apply ici ?

Par la suggestion de Yogos, le code le plus efficace peut se passer de la boucle 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]

}

2voto

jogo Points 9208

Vous pouvez accélérer en calculant colonne par colonne :

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

Finalement, ce qui suit est équivalent à votre code :

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

(cela ne sera pas beaucoup plus rapide que ma première variante, mais le code est plus compact)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X