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.

Multiplicando elementos de una matriz con elementos de una matriz de bloques del mismo tamaño en R.

Estoy ejecutando un algoritmo en el cual actualizo continuamente una matriz simétrica \Sigma que tiene elementos \sigma_{i,j}. También tengo una matriz simétrica fija X, y durante cada iteración necesito calcular la matriz de bloques que tiene elementos \sigma_{i,j} X, donde la matriz de bloques tiene la misma dimensión que \Sigma (si consideras \sigma_{i,j} X un solo elemento). ¿Existe una manera eficiente de codificar esto para una matriz \Sigma y X de tamaño general? He incluido un ejemplo que me gustaría que fuera más generalizable.

“`{r}
Sigma <- matrix(c(2, 1, 1, 2), 2, 2)

X <- matrix(c(3, 2, 1, 2, 4, 6, 1, 6, 5), 3, 3)

rbind(
cbind(
Sigma[1,1] * X, Sigma[1,2] * X
),
cbind(
Sigma[1,2] * X, Sigma[2,2] * X
)
)
“`
¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, existe una forma más eficiente de codificar esto para una matriz Sigma y X de tamaño general utilizando multiplicación de matrices e indexación. Aquí está el código:

    n <- nrow(Sigma) # obtener el número de filas/columnas de Sigma
    block <- matrix(0, n*dim(X)[1], n*dim(X)[2]) # crear una matriz de ceros con el tamaño de la matriz de bloques
    
    for (i in 1:n) {
      for (j in i:n) { # iterar sobre la parte triangular superior de Sigma para evitar redundancias
        block[(i-1)*dim(X)[1]+1:i*dim(X)[1], (j-1)*dim(X)[2]+1:j*dim(X)[2]] <- Sigma[i,j] * X
        block[(j-1)*dim(X)[1]+1:j*dim(X)[1], (i-1)*dim(X)[2]+1:i*dim(X)[2]] <- Sigma[i,j] * X # dado que Sigma es simétrica, necesitamos poblar los bloques simétricamente
      }
    }
    

    En este código, primero obtenemos el número de filas/columnas de Sigma (n) y creamos una matriz de ceros (block) con el tamaño de la matriz de bloques. Luego iteramos sobre la parte triangular superior de Sigma (i y j) y poblamos los bloques correspondientes de la matriz block con el producto elemento a elemento de Sigma[i,j] y X. Dado que Sigma es simétrica, necesitamos poblar los bloques de forma simétrica.

    En general, este código evita obtener subconjuntos de Sigma y X múltiples veces y utiliza indexación y multiplicación de matrices para crear eficientemente la matriz de bloques.

Comments are closed.