Matrices

Definición y operaciones con matrices.
array
rbind
cbind
dim
sqrt
log
diag
eigen
solve
crossprod
amtrix
t
Author

Román Salmerón Gómez

Published

November 27, 2022

En el caso de las matrices, éstas se pueden definir con el comando array:

X = array(1:5, dim=c(3,3)) # matriz 3x3 rellenada por columnas 
  # faltan elementos, luego los repite
X
     [,1] [,2] [,3]
[1,]    1    4    2
[2,]    2    5    3
[3,]    3    1    4
Y = array(1:9, c(3,3))
  # por defecto se rellenan las matrices por columnas
Y
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

Para hacer referencia a los elementos de la matriz jugamos a los barquitos:

X[1,2] # elemento (1,2) de 'X'
[1] 4
Y[,2] # columna 2 de 'Y'
[1] 4 5 6
Y[2,] # fila 2 de 'Y'
[1] 2 5 8

Para fusionar matrices tenemos los comandos rbind y cbind:

rbind(X,Y) # combino ambas matrices por filas, 'pongo una encima de la otra'
     [,1] [,2] [,3]
[1,]    1    4    2
[2,]    2    5    3
[3,]    3    1    4
[4,]    1    4    7
[5,]    2    5    8
[6,]    3    6    9
W = cbind(X,Y) # combino ambas matrices por columnas, 'pongo una al lado de la otra'
W
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    4    2    1    4    7
[2,]    2    5    3    2    5    8
[3,]    3    1    4    3    6    9
W[1:2, 3:5] # elementos de las filas 1 y 2 y columnas 3 a 5
     [,1] [,2] [,3]
[1,]    2    1    4
[2,]    3    2    5
W[c(1,3), c(3,5)] # elementos de las filas 1 y 3 y columnas 3 y 5
     [,1] [,2]
[1,]    2    4
[2,]    4    6

También se pueden definir matrices con el comando matrix:

X = matrix(1:9, c(3,3), byrow = TRUE) # matriz 3x3 rellenada por filas
X
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

Algunas operaciones con matrices:

dim(X) # dimensiones (número de filas y columnas) de la matriz
[1] 3 3
length(X) # número de elementos de una matriz
[1] 9
x = seq(1,100,1.5)
dim(x) # no funciona sobre vectores: equivalente a 'length' para las matrices
NULL
X/3  # ¡¡¡ATENCIÓN A CÓMO SE HACEN LAS OPERACIONES!!!
          [,1]      [,2] [,3]
[1,] 0.3333333 0.6666667    1
[2,] 1.3333333 1.6666667    2
[3,] 2.3333333 2.6666667    3
X^3 # potencia de una matriz (potencia de cada elemento)
     [,1] [,2] [,3]
[1,]    1    8   27
[2,]   64  125  216
[3,]  343  512  729
3*X-9 # combinación lineal de una matriz
     [,1] [,2] [,3]
[1,]   -6   -3    0
[2,]    3    6    9
[3,]   12   15   18
sqrt(X) # raíz cuadrada de cada elemento
         [,1]     [,2]     [,3]
[1,] 1.000000 1.414214 1.732051
[2,] 2.000000 2.236068 2.449490
[3,] 2.645751 2.828427 3.000000
log(X) # logaritmo de cada elemento
         [,1]      [,2]     [,3]
[1,] 0.000000 0.6931472 1.098612
[2,] 1.386294 1.6094379 1.791759
[3,] 1.945910 2.0794415 2.197225
exp(X) # exponencial de cada elemento
            [,1]        [,2]       [,3]
[1,]    2.718282    7.389056   20.08554
[2,]   54.598150  148.413159  403.42879
[3,] 1096.633158 2980.957987 8103.08393

Una vez más se observa que se hacen elemento a elemento.

Otras posibilidades interesantes son los comandos diag, det y solve:

diag(X) # diagonal principal de una matriz
[1] 1 5 9
diag(diag(X)) # matriz diagonal
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    5    0
[3,]    0    0    9
diag(3) # matriz identidad del orden indicado
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1
X - diag(3)
     [,1] [,2] [,3]
[1,]    0    2    3
[2,]    4    4    6
[3,]    7    8    8
det(X) # determinante de una matriz
[1] 6.661338e-16
solve(X - diag(3)) # inversa de una matriz
        [,1]     [,2]   [,3]
[1,] -0.5000  0.25000  0.000
[2,]  0.3125 -0.65625  0.375
[3,]  0.1250  0.43750 -0.250

Algo habitual al aplicar un comando es que los resultados obtenidos sean realmente una lista de resultados. En este caso es interesante saber cómo acceder a cada uno de ellos:

eigen(X) # autovalores y autovectores de una matriz
eigen() decomposition
$values
[1]  1.611684e+01 -1.116844e+00 -1.303678e-15

$vectors
           [,1]        [,2]       [,3]
[1,] -0.2319707 -0.78583024  0.4082483
[2,] -0.5253221 -0.08675134 -0.8164966
[3,] -0.8186735  0.61232756  0.4082483
eigen(X)[1] 
$values
[1]  1.611684e+01 -1.116844e+00 -1.303678e-15
eigen(X)[[1]] + 1 # para poder hacer operaciones (con un simple corchete da error)
[1] 17.116844 -0.116844  1.000000
eigen(X)[2]
$vectors
           [,1]        [,2]       [,3]
[1,] -0.2319707 -0.78583024  0.4082483
[2,] -0.5253221 -0.08675134 -0.8164966
[3,] -0.8186735  0.61232756  0.4082483

Algunas operaciones entre más de una matriz:

X/Y # división elemento a elemento
         [,1]     [,2]      [,3]
[1,] 1.000000 0.500000 0.4285714
[2,] 2.000000 1.000000 0.7500000
[3,] 2.333333 1.333333 1.0000000
X*Y # producto elemento a elemento
     [,1] [,2] [,3]
[1,]    1    8   21
[2,]    8   25   48
[3,]   21   48   81
X%*%Y # producto matricial
     [,1] [,2] [,3]
[1,]   14   32   50
[2,]   32   77  122
[3,]   50  122  194
crossprod(X) # X^{t}X
     [,1] [,2] [,3]
[1,]   66   78   90
[2,]   78   93  108
[3,]   90  108  126
X[2,2] = 0
solve(crossprod(X))%*%t(X)%*%Y # nos suena?
              [,1]          [,2]          [,3]
[1,]  3.774758e-15 -1.500000e+00 -3.000000e+00
[2,] -4.996004e-16 -1.554312e-15 -2.442491e-15
[3,]  3.333333e-01  1.833333e+00  3.333333e+00
solve(crossprod(X))%*%crossprod(X,Y)
              [,1]          [,2]          [,3]
[1,]  7.105427e-15 -1.500000e+00 -3.000000e+00
[2,] -3.330669e-16 -1.554312e-15 -2.220446e-15
[3,]  3.333333e-01  1.833333e+00  3.333333e+00
t(X) # traspuesta de una matriz
     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    0    8
[3,]    3    6    9
t(X) == Y # operadores lógicos
     [,1]  [,2] [,3]
[1,] TRUE  TRUE TRUE
[2,] TRUE FALSE TRUE
[3,] TRUE  TRUE TRUE

Finalmente, también se pueden definir vectores con el comando matrix:

x = matrix(1:3, c(1,3)) # vector fila
x
     [,1] [,2] [,3]
[1,]    1    2    3
# X%*%x # las dimensiones no coinciden

y = matrix(1:3, c(3,1)) # vector columna
y
     [,1]
[1,]    1
[2,]    2
[3,]    3
X%*%y
     [,1]
[1,]   14
[2,]   22
[3,]   50
crossprod(X,y) # ¡ojo! t(X)%*%y
     [,1]
[1,]   30
[2,]   26
[3,]   42
crossprod(t(X),y)  # t(t(X))%*%y = X%*%y
     [,1]
[1,]   14
[2,]   22
[3,]   50