Operaciones con matrices en R
Existen múltiples operaciones con matrices que puedes realizar en R, tales como sumas, restas y multiplicaciones, calcular la potencia, el rango, el determinante, la diagonal, los autovalores y autovectores, la matriz traspuesta y descomponer la matriz mediante diferentes métodos. En este artículo revisaremos como realizar estas operaciones algebraicas en R.
Suma y resta
Las operaciones más básicas con matrices que se pueden realizar son sumas y restas. En los siguientes ejemplos vamos a usar las matrices cuadradas del siguiente bloque de código:
A <- matrix(c(10, 8,
5, 12), ncol = 2, byrow = TRUE)
A
B <- matrix(c(5, 3,
15, 6), ncol = 2, byrow = TRUE)
B
# A # B
[, 1] [, 2] [, 1] [, 2]
[1, ] 10 8 [1, ] 5 3
[2, ] 5 12 [2, ] 15 6
Estas matrices tienen ambas las mismas dimensiones. Puedes comprobar las dimensiones (número de filas y columnas, respectivamente) de una matriz con la función dim
.
dim(A) # 2 2
dim(B) # 2 2
Por un lado, con el operador +
puedes realizar la suma elemento a elemento:
A + B
[, 1] [, 2]
[1, ] 15 11
[2, ] 20 18
Por otro lado, el operador -
te permitirá realizar la resta:
A - B
[, 1] [, 2]
[1, ] 5 5
[2, ] -10 6
Trasponer una matriz
Para trasponer una matriz en R tan solo tienes que usar la función t
como sigue:
t(A)
[, 1] [, 2]
[1, ] 10 5
[2, ] 8 12
t(B)
[, 1] [, 2]
[1, ] 5 15
[2, ] 3 6
Multiplicación de matrices en R
Existen diferentes maneras de multiplicar matrices: por un escalar, elemento a elemento, multiplicación matricial, exterior y producto de Kronecker.
Multiplicación por un escalar
Para multiplicar o dividir una matriz por un escalar tienes que hacer uso de los operadores *
o /
, respectivamente:
2 * A
[, 1] [, 2]
[1, ] 20 16
[2, ] 10 24
A / 2
[, 1] [, 2]
[1, ] 5.0 4
[2, ] 2.5 6
Multiplicación elemento a elemento
La multiplicación de dos matrices de la misma dimensión elemento también se puede calcular con el operador *
. La salida será una matriz de las mismas dimensiones que las matrices originales.
A * B
[, 1] [, 2]
[1, ] 50 24
[2, ] 75 72
Para calcular el producto matricial elemento a elemento ambas matrices deben tener las mismas dimensiones.
Producto matricial
En R, la multiplicación matricial se puede realizar con el operador %*%
.
A %*% B
[, 1] [, 2]
[1, ] 170 78
[2, ] 205 87
Antes de multiplicar dos matrices comprueba que las dimensiones son compatibles. El número de columnas de la primera matriz debe ser igual al número de filas de la segunda.
Producto cruzado
Si necesitas calcular el producto matricial de una matriz y la traspuesta de otra puedes escribir t(A) %\*% B
o A %\*% t(B)
, siendo A
y B
los nombres de las matrices. Sin embargo, en R es más eficiente y rápido usar las funciones crossprod
y tcrossprod
, respectivamente.
crossprod(A, B)
[, 1] [, 2]
[1, ] 125 60
[2, ] 220 96
tcrossprod(A, B)
[,1 ] [, 2]
[1, ] 74 198
[2, ] 61 147
Producto exterior
De forma similar a la multiplicación matricial en R puedes calcular el producto exterior de dos matrices con el operador %o%
. Este operador es un atajo para la función outer
, con sus argumentos por defecto.
A %o% B
# Equivalente a:
outer(A, B, FUN = "*")
, , 1, 1
[, 1] [, 2]
[1, ] 50 40
[2, ] 25 60
, , 2, 1
[, 1] [, 2]
[1, ] 150 120
[2, ] 75 180
, , 1, 2
[, 1] [, 2]
[1, ] 30 24
[2, ] 15 36
, , 2, 2
[, 1] [, 2]
[1, ] 60 48
[2, ] 30 72
Producto Kronecker
El producto de Kronecker de dos matrices \(A\) y \(B\), denotado por \(A \otimes B\) es el último tipo de multiplicación de matrices que vamos a revisar. En R, el cálculo se puede realizar con el operador %x%
.
A %x% B
[, 1] [, 2] [, 3] [, 4]
[1, ] 50 30 40 24
[2, ] 150 60 120 48
[3, ] 25 15 60 36
[4, ] 75 30 180 72
Potencia de una matriz en R
No existe una función en R base para calcular la potencia de una matriz, por lo que propondremos dos alternativas diferentes.
Por una parte, puedes hacer uso del operador %^%
del paquete expm
como sigue:
# install.packages("expm")
library(expm)
A %^% 2
[, 1] [, 2]
[1, ] 140 176
[2, ] 110 184
Por otra parte el paquete matrixcalc
proporciona la función matrix.power
:
# install.packages("matrixcalc")
library(matrixcalc)
matrix.power(A, 2)
[, 1] [, 2]
[1, ] 140 176
[2, ] 110 184
Puedes comprobar que la salida anterior es correcta con el siguiente código:
A %*% A
La matriz debe ser cuadrada para calcular la potencia, ya que el número de columnas debe ser igual al número de filas para realizar los cálculos.
Ten en cuenta que si quieres realizar la potencia elemento a elemento tan solo tienes que usar el operador ^
. En este caso la matriz no tiene por qué ser cuadrada.
A ^ 2
[, 1] [, 2]
[1, ] 100 64
[2, ] 25 144
Determinante de una matriz en R
El determinante de una matriz \(A\), denotado habitualmente como \(|A|\), es un valor escalar que alberga ciertas propiedades de una matriz. En R puedes hacer uso de la función det
para calcularlo.
det(A) # 80
det(B) # -15
Inversa de una matriz en R
Para calcular la inversa de una matriz en R puedes hacer uso de la función solve
.
M <- solve(A)
M
[, 1] [, 2]
[1, ] 0.1500 -0.100
[2, ] -0.0625 0.125
Ya que una matriz multiplicada por su inversa es la matriz identidad podemos verificar que el resultado es correcto de la siguiente manera:
A %*% M
[, 1] [, 2]
[1, ] 1 0
[2, ] 0 1
Además, dado que el uso principal de la función solve
es resolver un sistema de ecuaciones, en caso de que quieras calcular la solución de \(A\)%*% \(X = B\) puedes escribir:
solve(A, B)
[, 1] [, 2]
[1, ] -0.7500 -0.1500
[2, ] 1.5625 0.5625
Rango de una matriz en R
El rango de una matriz es el mayor número de columnas (filas) que son linealmente independientes. En R no existe una función base para calcular el rango de una matriz, pero podemos hacer uso de la función qr
que además de calcular la descomposición QR devuelve el rango de la matriz de entrada. Una alternativa es usar la función rankMatrix
del paquete Matrix
.
qr(A)$rank # 2
qr(B)$rank # 2
# Equivalente a:
library(Matrix)
rankMatrix(A)[1] # 2
Diagonal de la matriz
La función diag
permite extraer o reemplazar la diagonal de la matriz:
# Extraemos la diagonal
diag(A) # 10 12
diag(B) # 5 6
# Reemplazamos la diagonal
# diag(A) <- c(0, 2)
Aplicando la función rev
a las columnas de la matriz también se pueden extraer los elementos de la diagonal secundaria:
# Extraemos las diagonales secundarias
diag(apply(A, 2, rev)) # 5 8
diag(apply(B, 2, rev)) # 15 3
Matriz diagonal
Con la función diag
también puedes crear una matriz diagonal, pasando como entrada un vector a la función.
diag(c(7, 9, 2))
[, 1] [, 2] [, 3]
[1, ] 7 0 0
[2, ] 0 9 0
[3, ] 0 0 2
Matriz identidad en R
Además de las funcionalidades previas, la función diag
también permite crear matrices identidad, especificando la dimensión de la matriz deseada.
diag(4)
[, 1] [, 2] [, 3] [, 4]
[1, ] 1 0 0 0
[2, ] 0 1 0 0
[3, ] 0 0 1 0
[4, ] 0 0 0 1
Autovalores y autovectores en R
Tanto los autovalores como los autovectores de una matriz se pueden calcular en R con la función eigen
.
Por un lado, los autovalores se almacenan en el elemento values
de la lista que devuelve la función. Los autovalores se mostrarán en orden decreciente:
eigen(A)$values # 17.403124 4.596876
eigen(B)$values # 12.226812 -1.226812
Por otro lado, los autovectores se almacenan en el elemento vectors
:
eigen(A)$vectors
[, 1] [, 2]
[1, ] -0.7339565 -0.8286986
[2, ] -0.6791964 0.5596952
eigen(B)$vectors
[, 1] [, 2]
[1, ] -0.3833985 -0.4340394
[2, ] -0.9235830 0.9008939
Descomposición singular, QR y de Cholesky en R
En esta última sección vamos a revisar cómo realizar algunas descomposiciones relacionadas con matrices.
Primero, la descomposición en valores singulares, descomposición singular o SVD, por sus siglas en inglés, se puede calcular con la función svd
.
svd(A)
$d
[1] 17.678275 4.525328
$u
[, 1] [, 2]
[1, ] -0.7010275 -0.7131342
[2, ] -0.7131342 0.7010275
$v
[, 1] [, 2]
[1, ] -0.5982454 -0.8013130
[2, ] -0.8013130 0.5982454
La función devolverá una lista, donde el primer elemento, d
, es un vector que contiene los valores singulares ordenados en orden decreciente, y u
y v
son matrices que contienen los vectores singulares derechos e izquierdos de la matriz original, respectivamente.
Segundo, la función qr
permite calcular la descomposición QR. El primer elemento de la salida devolverá una matriz de las mismas dimensiones que la matriz original, donde la matriz triangular superior contiene la \(\bold{R}\) de la descomposición y la inferior la \(\bold{Q}\).
qr(A)$qr
[, 1] [, 2]
[1, ] -11.1803399 -12.521981
[2, ] 0.4472136 7.155418
Por último, puedes realizar la factorización de Cholesky de una matriz cuadrada real definida positiva con la función chol
.
chol(A)
[, 1] [, 2]
[1, ] 3.162278 2.529822
[2, ] 0.000000 2.366432
La función chol
no comprueba la simetría. Sin embargo, puedes hacer uso de la función isSymmetric
para comprobarla.