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!
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:
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
yj
) y poblamos los bloques correspondientes de la matrizblock
con el producto elemento a elemento deSigma[i,j]
yX
. 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.