vectores vacio una transpuesta studio seleccionar repeticiones multiplicacion matriz matrices listas crear contar concatenar columnas r matrix

vacio - Obtener todos los vectores diagonales de la matriz



seleccionar columnas en r (3)

Estoy tratando de averiguar cómo obtener todas las diagonales de una matriz. Por ejemplo, digamos que tengo la siguiente matriz: A <- matriz (1: 16,4)

utilizando la función diag(A) volverá

[1] 1 6 11 16

Además de la diagonal primaria, me gustaría una lista de todas las diagonales arriba y abajo.

5 10 15 2 7 12 9 14 3 8 4 13

Encontré el siguiente enlace https://stackoverflow.com/a/13049722 que me da las diagonales directamente arriba y debajo de la primaria, sin embargo, no puedo encontrar la forma de extender el código para obtener el resto de ellas en cualquier tamaño matriz. Probé dos anidados para bucles, ya que parece que algún tipo de incremento de los subíndices de la matriz produciría el resultado que estoy buscando. Intenté usar ncol (A), nrow (A) en los bucles for, pero no pude encontrar la combinación correcta. Además, soy consciente de que los bucles generalmente son mal vistos en R.

El código dado fue:

diag(A[-4,-1]) diag(A[-1,-4])

que devolvió las dos diagonales, tanto superior como inferior

Por supuesto, esta es una matriz cuadrada y no todas las matrices en las que quiero realizar esto serán cuadradas. Rellenar el área no cuadrada con NA sería aceptable si fuera necesario. La respuesta que necesito puede estar en una de las otras respuestas en la página, pero la pregunta original involucraba medios, sumas, etc. que agregaron una capa de complejidad más allá de lo que estoy tratando de hacer. Tengo la sensación de que la solución a esto será ridículamente simple, pero simplemente no se me ocurre. También me sorprende que no haya podido encontrar esta pregunta en ningún lugar, por lo que parece ser una pregunta bastante común. Tal vez no conozco la terminología adecuada para este problema.


Aquí hay una solución basada en una observación que puede obtener todas las diagonales al reducir y expandir la matriz. Eso es primero considerar la fila N col 1 (obtener diag de eso) luego las filas (N-1): y cols (1: 2). Obtener diagonal de eso. etc.

N <- ncol(A) rows <- cbind(c(N:1, rep(1,N-1)), c(rep(N,N), (N-1):1)) # row indeces cols <- apply(rows, 2, rev) # col indeces diagMatSubset <- function(mat, i1, i2, j1, j2) diag(mat[i1:i2, j1:j2, drop=FALSE]) Map(diagMatSubset, list(A), rows[,1], rows[,2], cols[,1], cols[,2]) [[1]] [1] 4 [[2]] [1] 3 8 [[3]] [1] 2 7 12 [[4]] [1] 1 6 11 16 [[5]] [1] 5 10 15 [[6]] [1] 9 14 [[7]] [1] 13


Como se trata de matrices cuadradas, debería ser realmente fácil convertir la respuesta de Gavin en una pequeña función que primero calcula el rango que se debe usar como valores de compensación. Aquí hay una función:

AllDiags <- function(inmat, sorted = TRUE) { Range <- ncol(inmat) - 1 Range <- -Range:Range if (isTRUE(sorted)) Range <- Range[order(abs(Range))] lapply(Range, function(x) { inmat[row(inmat) == (col(inmat) - x)] }) }

Aquí está la salida en su matriz de muestra "A".

AllDiags(A) # [[1]] # [1] 1 6 11 16 # # [[2]] # [1] 2 7 12 # # [[3]] # [1] 5 10 15 # # [[4]] # [1] 3 8 # # [[5]] # [1] 9 14 # # [[6]] # [1] 4 # # [[7]] # [1] 13


A <- matrix(1:16, 4) # create an indicator for all diagonals in the matrix d <- row(A) - col(A) # use split to group on these values split(A, d) # # $`-3` # [1] 13 # # $`-2` # [1] 9 14 # # $`-1` # [1] 5 10 15 # # $`0` # [1] 1 6 11 16 # # $`1` # [1] 2 7 12 # # $`2` # [1] 3 8 # # $`3` # [1] 4