Matriz diagonal en R

Como ya se ha visto en la entrada Trabajando con Matrices en R, para generar una matriz unitaria (esto es una matriz con unos en la diagonal y ceros en otro lado, es decir, y ) se utiliza la función diag() y como argumento se proporciona el número de elementos que contendrá la diagonal principal, así pues si se escribe diag(2), se tendrá como resultado una matriz unitaria de dimensión 2x2, si se escribe diag(3) se obtendrá una matriz unitaria 3x3, y así sucesivamente.
diag(2)
     [,1] [,2]
[1,]    1    0
[2,]    0    1
Por otro lado, si queremos una matriz con unos en su diagonal pero que esta matriz no sea cuadrada, pues se tendrá que escribir la dimensión de la matriz en la misma función, esto es diag(x, nrow, ncol), donde x será el número que tomará la diagonal, nrow es la dimensión de la fila y ncol es la dimensión de la columna, de manera que una matriz con unos en la diagonal pero que sea de dimensión 2x3 se debe especificar como diag(1, nrow=2, ncol=3) o simplemente diag(1,2,3) recuérdese la explicación sobre el orden de los argumentos y el hecho de nombrarlos explícitamente (esta explicación se dio en la función seq())
diag(1,2,3)
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0

Pero si lo que interesa es crear una matriz cuadrada con números en la diagonal diferentes de uno, entonces esto se hace utilizando nuevamente la función diag(x, nrow, ncol),  en el ejemplo anterior se dio una pista de cómo hacerlo y ahora se hará una matriz cuadrada de dimensión 4x4 con 2 a lo largo de toda su diagonal.
 diag(2,4,4)
     [,1] [,2] [,3] [,4]
[1,]    2    0    0    0
[2,]    0    2    0    0
[3,]    0    0    2    0
[4,]    0    0    0    2

Hasta este punto sólo se han hecho matrices diagonales cuya diagonal principal es un número constante, pero  también es posible crear matrices diagonales con diferentes números en si diagonal. Por ejemplo, en este caso haremos una matriz cuyos elementos de la diagonal serán 1, 2 y 3, esta matriz será cuadrada con lo que su dimensión deberá ser 3x3.
diag(seq(1:3), 3, 3)
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    2    0
[3,]    0    0    3

Con las funciones que se han explicado en la entrada Introducción a las funciones básicas de R: Funciones con Vectores podremos definir variedad de matrices diagonales utilizando las funciones seq(), rep(), length() y c(). Por ejemplo:
x<-seq(2,10,2)
diag(x, 5,5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    0    0    0    0
[2,]    0    4    0    0    0
[3,]    0    0    6    0    0
[4,]    0    0    0    8    0
[5,]    0    0    0    0   10

Se obtiene el mismo resultado con diag(seq(2,10,2), 5,5), o si no se sabes la dimensión entonces será útil la función length() por ejemplo
x<-seq(2,10,2)
diag(x, length(x))
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    0    0    0    0
[2,]    0    4    0    0    0
[3,]    0    0    6    0    0
[4,]    0    0    0    8    0
[5,]    0    0    0    0   10

Nótese que si se omite una de las dimensiones de la matriz en la función diag() ésta devolverá una matriz cuadrada utilizando como input para determinar la dimensión de la matriz el número de filas o el número de columnas que se le proporcione, en el ejemplo anterior sólo se le proporcionó nrow=length(x) y no se escribió nada en ncol, así se se hubiere querido se hubiera escrito diag(x, length(x), length(x))con lo que se le estaría dando tanto la dimensión de fila y columnas, con esto se obtiene el mismo resultado del ejemplo anterior en que sólo se escribió diag(x, length(x)).
Otros ejemplos son:
diag(c(7,2,5),3)
     [,1] [,2] [,3]
[1,]    7    0    0
[2,]    0    2    0
[3,]    0    0    5
diag(rep(1:2, each=2), 4)
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    1    0    0
[3,]    0    0    2    0
[4,]    0    0    0    2

¿Ha sido de utilidad? ¿Ha sido claro? Deja tu comentario!
Jilber Urbina

6 comentarios:

  1. Como puedo sumar los numeros de la diagonal?

    ResponderEliminar
  2. Como hago para hallar la diagonal de la matriz sin usar diag()

    ResponderEliminar
  3. 1 0 0 0 0 0 0 00 2 0 0 0 0 0 00 0 3 0 0 0 0 00 0 0 4 0 0 0 00 0 0 0 1 0 0 00 0 0 0 0 2 0 00 0 0 0 0 0 3 00 0 0 0 0 0 0 41 0 0 0 0 0 0 00 2 0 0 0 0 0 00 0 1 0 0 0 0 00 0 0 2 0 0 0 00 0 0 0 1 0 0 00 0 0 0 0 2 0 00 0 0 0 0 0 1 00 0 0 0 0 0 0 2

    ResponderEliminar