Operaciones con matrices en R

Introducción a R Funciones matemáticas
Operaciones con matrices en R. Calcula algebra matricial como multiplicaciones, el determinante, el rango, descomposiciones, la traspuesta o la inversa

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.