2.2 Matrices y arrays
2.2.1 Matrices
Las matrices son la extensión natural de los vectores a dos dimensiones. Su generalización a más dimensiones se llama array.
Las matrices se pueden crear concatenando vectores con las funciones cbind()
o rbind()
:
<- c(3, 7, 1, 8, 4)
x <- c(7, 5, 2, 1, 0)
y cbind(x, y) # por columnas
## x y
## [1,] 3 7
## [2,] 7 5
## [3,] 1 2
## [4,] 8 1
## [5,] 4 0
rbind(x, y) # por filas
## [,1] [,2] [,3] [,4] [,5]
## x 3 7 1 8 4
## y 7 5 2 1 0
Una matriz se puede crear con la función matrix()
donde el parámetro nrow
indica el número de filas y ncol
el número de columnas.
Por defecto, los valores se colocan por columnas.
matrix(1:8, nrow = 2, ncol = 4) # equivalente a matrix(1:8, nrow=2)
## [,1] [,2] [,3] [,4]
## [1,] 1 3 5 7
## [2,] 2 4 6 8
Los nombres de los parámetros se pueden acortar siempre y cuando no haya ambigüedad, por lo que podríamos escribir
matrix(1:8, nr = 2, nc = 4)
## [,1] [,2] [,3] [,4]
## [1,] 1 3 5 7
## [2,] 2 4 6 8
Si queremos indicar que los valores se almacenen por filas
matrix(1:8, nr = 2, byrow = TRUE)
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
2.2.2 Nombres en matrices
Se pueden dar nombres a las filas y columnas de una matriz.
<- matrix(c(1, 2, 3, 11, 12, 13), nrow = 2, byrow = TRUE)
x x
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 11 12 13
rownames(x) <- c("fila 1", "fila 2")
colnames(x) <- c("col 1", "col 2", "col 3")
x
## col 1 col 2 col 3
## fila 1 1 2 3
## fila 2 11 12 13
Obtenemos el mismo resultado si escribimos
colnames(x) <- paste("col", 1:ncol(x), sep=" ")
Internamente, las matrices son vectores con un atributo especial: la dimensión.
dim(x)
## [1] 2 3
attributes(x)
## $dim
## [1] 2 3
##
## $dimnames
## $dimnames[[1]]
## [1] "fila 1" "fila 2"
##
## $dimnames[[2]]
## [1] "col 1" "col 2" "col 3"
2.2.3 Acceso a los elementos de una matriz
El acceso a los elementos de una matriz se realiza de forma análoga al acceso ya comentado para los vectores.
<- matrix(1:6, 2, 3); x x
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
1, 1] x[
## [1] 1
2, 2] x[
## [1] 4
2, ] # segunda fila x[
## [1] 2 4 6
2] # segunda columna x[ ,
## [1] 3 4
1, 1:2] # primera fila, columnas 1ª y 2ª x[
## [1] 1 3
2.2.4 Ordenación por filas y columnas
En ocasiones, interesará ordenar los elementos de una matriz por los valores de una determinada columna o fila.
Por ejemplo, supongamos la matriz
<- c(79, 100, 116, 121, 52, 134, 123, 109, 80, 107, 66, 118)
x <- matrix(x, ncol=4, byrow=T); x x
## [,1] [,2] [,3] [,4]
## [1,] 79 100 116 121
## [2,] 52 134 123 109
## [3,] 80 107 66 118
La matriz ordenada por los valores de la primera columna viene dada por
<- order(x[ ,1])
ii # ordenación columna 1 x[ii, ]
## [,1] [,2] [,3] [,4]
## [1,] 52 134 123 109
## [2,] 79 100 116 121
## [3,] 80 107 66 118
De igual modo, si queremos ordenar por los valores de la cuarta columna:
<- order(x[ ,4]); x[ii, ] # ordenación columna 4 ii
## [,1] [,2] [,3] [,4]
## [1,] 52 134 123 109
## [2,] 80 107 66 118
## [3,] 79 100 116 121
2.2.5 Operaciones con Matrices y Arrays
A continuación se muestran algunas funciones que se pueden emplear con matrices
Función | Descripción |
---|---|
dim(), nrow(), ncol() |
número de filas y/o columnas |
diag() |
diagonal de una matrix |
* |
multiplicación elemento a elemento |
%*% |
multiplicación matricial de matrices |
cbind(), rbind() |
encadenamiento de columnas o filas |
t() |
transpuesta |
solve(A) |
inversa de la matriz A |
solve(A,b) |
solución del sistema de ecuaciones \(Ax=b\) |
qr() |
descomposición de Cholesky |
eigen() |
autovalores y autovectores |
svd() |
descomposición singular |
2.2.6 Ejemplos
<- matrix(1:6, ncol = 3)
x x
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
t(x) # matriz transpuesta
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
dim(x) # dimensiones de la matriz
## [1] 2 3
2.2.7 Inversión de una matriz
<- matrix(c(2, 4, 0, 2), nrow = 2); A A
## [,1] [,2]
## [1,] 2 0
## [2,] 4 2
<- solve(A)
B # inversa B
## [,1] [,2]
## [1,] 0.5 0.0
## [2,] -1.0 0.5
%*% B # comprobamos que está bien A
## [,1] [,2]
## [1,] 1 0
## [2,] 0 1