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.