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():

x <- c(3, 7, 1, 8, 4)
y <- c(7, 5, 2, 1, 0)
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.

x <- matrix(c(1, 2, 3, 11, 12, 13), nrow = 2, byrow = TRUE)
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.

x <- matrix(1:6, 2, 3); x
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
x[1, 1]
## [1] 1
x[2, 2]
## [1] 4
x[2, ]  # segunda fila
## [1] 2 4 6
x[ ,2]  # segunda columna
## [1] 3 4
x[1, 1:2]  # primera fila, columnas 1ª y 2ª 
## [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

x <- c(79, 100, 116, 121, 52, 134, 123, 109, 80, 107, 66, 118)
x <- matrix(x, ncol=4, byrow=T); 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

ii <- order(x[ ,1])
x[ii, ]  # ordenación columna 1
##      [,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:

ii <- order(x[ ,4]); x[ii, ]  # ordenación columna 4
##      [,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

x <- matrix(1:6, ncol = 3)
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

A <- matrix(c(2, 4, 0, 2), nrow = 2); A
##      [,1] [,2]
## [1,]    2    0
## [2,]    4    2
B <- solve(A)
B  # inversa
##      [,1] [,2]
## [1,]  0.5  0.0
## [2,] -1.0  0.5
A %*% B  # comprobamos que está bien
##      [,1] [,2]
## [1,]    1    0
## [2,]    0    1