Hay varias maneras de definir una matriz en R. Si es una matriz pequeña podemos utilizar la siguiente sintaxis:
A=matrix(nrow=3,ncol=3, c(1,2,3,4,5,6,7,8,9),byrow=TRUE)
Con el argumento nrow
hemos indicado el número de filas de nuestra matriz, con ncol
el número de columnas; a continuación hemos puesto los valores que forman la matriz (los valores del 1 al 9), y le hemos pedido a R que use esos valores para rellenar la matriz A por filas (byrow=TRUE
). La matriz A así construida es:
A
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
Comprueba como queda la matriz si se utiliza byrow=FALSE
Si disponemos de varios vectores de la misma longitud que queremos utilizar como filas (o columnas) de una matriz, podemos utilizar la función rbind()
para unirlos por filas, o la función cbind()
para unirlos por columnas, como vemos en el siguiente ejemplo:
vector1 = c(1,2,3,4)
vector2 = c(5,6,7,8)
vector3 = c(9,10,11,12)
M1 = cbind(vector1,vector2,vector3) # Unimos por columnas
M1
## vector1 vector2 vector3
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
Crea una matriz M2 con los vectores anteriores unidos por filas mediante rbind()
. Compara el resultado con la matriz M1 anterior.
Se pueden seleccionar partes de una matriz utilizando los índices de posición [fila, columna] entre corchetes. El siguiente ejemplo ilustra la forma de hacerlo:
A[2,3] # Se selecciona el valor de la fila 2, columna 3
## [1] 6
A[2,] # Se selecciona la fila 2 completa
## [1] 4 5 6
A[,3] # Se selecciona la columna 3 completa
## [1] 3 6 9
A[1,2:3] # Se seleccionan el segundo y tercer valor de la fila 1
## [1] 2 3
La función diag()
extrae la diagonal principal de una matriz:
diag(A)
## [1] 1 5 9
También permite crear matrices diagonales:
diag(c(1,2,3,4))
## [,1] [,2] [,3] [,4]
## [1,] 1 0 0 0
## [2,] 0 2 0 0
## [3,] 0 0 3 0
## [4,] 0 0 0 4
La matriz identidad es muy fácil de crear en R. Por ejemplo, la matriz identidad de dimensión 4 es:
Id4=diag(1,nrow=4)
Id4
## [,1] [,2] [,3] [,4]
## [1,] 1 0 0 0
## [2,] 0 1 0 0
## [3,] 0 0 1 0
## [4,] 0 0 0 1
Hay que tener cierto cuidado con los operadores aritméticos básicos. Si se suman una matriz y una constante, el efecto es que dicha constante se suma a todos los elementos de la matriz. Lo mismo ocurre con la diferencia, la multiplicación y la división:
M = matrix(nrow=2,c(1,2,5,7),byrow=F)
M
## [,1] [,2]
## [1,] 1 5
## [2,] 2 7
M+2
## [,1] [,2]
## [1,] 3 7
## [2,] 4 9
Descubrir lo que ocurre con la diferencia, la multiplicación y la división de una matriz y un escalar.
Asimismo, si a una matriz se le suma un vector cuya longitud sea igual al número de filas de la matriz, se obtiene como resultado una nueva matriz cuyas columnas son la suma de las columnas de la matriz original más dicho vector.
v=c(3,4)
M+v
## [,1] [,2]
## [1,] 4 8
## [2,] 6 11
Descubrir lo que ocurre con la diferencia, la multiplicación y la división de matriz y vector.
La suma o resta de matrices de la misma dimensión se realiza con los operadores + y -; el producto de matrices (siempre que sean compatibles) se realiza con el símbolo%*%
:
M+M
## [,1] [,2]
## [1,] 2 10
## [2,] 4 14
M-M
## [,1] [,2]
## [1,] 0 0
## [2,] 0 0
M%*%M
## [,1] [,2]
## [1,] 11 40
## [2,] 16 59
Una fuente de posibles errores en el cálculo matricial, cuando se utilizan matrices de la misma dimensión, es utilizar los operadores *
y /
ya que multiplican (o dividen) las matrices término a término:
M*M
## [,1] [,2]
## [1,] 1 25
## [2,] 4 49
M/M
## [,1] [,2]
## [1,] 1 1
## [2,] 1 1
R no dispone en su paquete base de una función para calcular la potencia n-ésima de una matriz. No obstante el paquete expm
implementa el operador %^%
construido con este objetivo. Su uso es muy simple: si queremos calcular la matriz \(A^{n}\) bastará con utilizar el comando A %^% n
. Para que funcione esta instrucción debemos cargar previamente el paquete expm
:
library(expm)
A=matrix(1:4,nrow=2)
A
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
A%*%A
## [,1] [,2]
## [1,] 7 15
## [2,] 10 22
A %^% 2
## [,1] [,2]
## [1,] 7 15
## [2,] 10 22
A %^% 5
## [,1] [,2]
## [1,] 1069 2337
## [2,] 1558 3406
La traspuesta de una matriz se calcula simplemente con la función t()
det(A)
## [1] -2
El determinante de una matriz cuadrada se calcula mediante la función det()
:
det(A)
## [1] -2
R dispone de la función solve()
para resolver sistemas de ecuaciones lineales. En particular, si el sistema a resolver es de la forma \(Ax=b\) (donde \(b\) podría ser también una matriz), su solución es \(x=A^{-1}b\), que en R se obtiene mediante solve(A,b)
.
En particular, si b es la matriz identidad, la función anterior devuelve la matriz inversa de A:
A=matrix(ncol=3,c(2,4,3,5,7,1,2,2,3),byrow=TRUE)
A
## [,1] [,2] [,3]
## [1,] 2 4 3
## [2,] 5 7 1
## [3,] 2 2 3
I=diag(1,nrow=3) # Matriz diagonal de dimension 3
solve(A,I) # Matriz inversa de A
## [,1] [,2] [,3]
## [1,] -0.730769 0.230769 0.653846
## [2,] 0.500000 0.000000 -0.500000
## [3,] 0.153846 -0.153846 0.230769
Podemos obviar la referencia a la matriz identidad \(I\). Si utilizamos solamente solve(A)
obtenemos también la inversa de A:
invA =solve(A)
invA
## [,1] [,2] [,3]
## [1,] -0.730769 0.230769 0.653846
## [2,] 0.500000 0.000000 -0.500000
## [3,] 0.153846 -0.153846 0.230769
A %*% invA
## [,1] [,2] [,3]
## [1,] 1.00000e+00 -5.55112e-17 -1.11022e-16
## [2,] -3.05311e-16 1.00000e+00 -1.11022e-16
## [3,] -2.77556e-17 -5.55112e-17 1.00000e+00
invA %*% A
## [,1] [,2] [,3]
## [1,] 1.00000e+00 -4.44089e-16 -1.11022e-16
## [2,] 0.00000e+00 1.00000e+00 0.00000e+00
## [3,] -5.55112e-17 0.00000e+00 1.00000e+00
La función eigen()
calcula los autovalores y autovectores de una matriz:
eigen(M)
## eigen() decomposition
## $values
## [1] 8.358899 -0.358899
##
## $vectors
## [,1] [,2]
## [1,] -0.561999 -0.964996
## [2,] -0.827138 0.262266
© 2016 Angelo Santana, Carmen N. Hernández, Departamento de Matemáticas ULPGC