es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo acelerar el muestreo binario en R?

Tengo un vector de soluciones que varía en longitud, pero puede tener hasta 1500 números. Quiero muestrear x soluciones a la vez, a las cuales luego les realizaré algunos cálculos de matriz. El problema que encuentro es que R es muy lento para crear una matriz de muestras binarias, incluso cuando preasigno la variable. ¿Existe una forma más eficiente de crear la matriz debajo?

all_sol <- rnorm(1500)
sol_num <- length(all_sol)
startran <- 10*nrow(all_sol)
nlin <- 20
initguess <- data.frame(matrix(rep(0, sol_num * startran), nrow = startran, ncol = sol_num))

for(i in 1:startran){
# obtengo los índices para reemplazar
samp = sample.int(sol_num, size = nlin)

# establezco los nuevos valores
initguess[i, samp] = 1
}

initguess <- as.matrix(initguess, nrow = startran, ncol = sol_num)

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma más eficiente de crear la matriz de muestras binarias. Una forma es usar el operador de multiplicación de matrices %*% con una matriz binaria creada usando la función sample() en lugar de un bucle for. Aquí hay un ejemplo de fragmento de código que reemplaza el bucle for:

    {r}
    samp_mat <- matrix(sample(c(0,1), nlin*startran*sol_num, replace=TRUE),
    nrow=startran*nlin, ncol=sol_num)
    initguess <- matrix(samp_mat %*% diag(all_sol), nrow=startran, ncol=sol_num)

    Explicación: sample(c(0,1), nlin*startran*sol_num, replace=TRUE) genera una matriz binaria con nlin*startran filas y sol_num columnas, donde cada elemento tiene una probabilidad igual de ser 0 o 1. La multiplicación de matrices samp_mat %*% diag(all_sol) multiplica cada fila de samp_mat con el elemento correspondiente de all_sol (usando la matriz diagonal diag(all_sol)) y suma los productos para obtener un vector de fila de la misma longitud que all_sol. Esto se repite startran veces para obtener una matriz de startran filas, cada una correspondiente a x soluciones seleccionadas al azar de all_sol. La matriz resultante initguess tiene startran filas y sol_num columnas, donde cada fila representa una muestra de x soluciones.

Comments are closed.