En el caso de las matrices, éstas se pueden definir con el comando array :
X = array (1 : 5 , dim= c (3 ,3 )) # matriz 3x3 rellenada por columnas
# faltan elementos, luego los repite
X
[,1] [,2] [,3]
[1,] 1 4 2
[2,] 2 5 3
[3,] 3 1 4
Y = array (1 : 9 , c (3 ,3 ))
# por defecto se rellenan las matrices por columnas
Y
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
Para hacer referencia a los elementos de la matriz jugamos a los barquitos:
X[1 ,2 ] # elemento (1,2) de 'X'
Para fusionar matrices tenemos los comandos rbind y cbind :
rbind (X,Y) # combino ambas matrices por filas, 'pongo una encima de la otra'
[,1] [,2] [,3]
[1,] 1 4 2
[2,] 2 5 3
[3,] 3 1 4
[4,] 1 4 7
[5,] 2 5 8
[6,] 3 6 9
W = cbind (X,Y) # combino ambas matrices por columnas, 'pongo una al lado de la otra'
W
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 4 2 1 4 7
[2,] 2 5 3 2 5 8
[3,] 3 1 4 3 6 9
W[1 : 2 , 3 : 5 ] # elementos de las filas 1 y 2 y columnas 3 a 5
[,1] [,2] [,3]
[1,] 2 1 4
[2,] 3 2 5
W[c (1 ,3 ), c (3 ,5 )] # elementos de las filas 1 y 3 y columnas 3 y 5
[,1] [,2]
[1,] 2 4
[2,] 4 6
También se pueden definir matrices con el comando matrix :
X = matrix (1 : 9 , c (3 ,3 ), byrow = TRUE ) # matriz 3x3 rellenada por filas
X
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
Algunas operaciones con matrices:
dim (X) # dimensiones (número de filas y columnas) de la matriz
length (X) # número de elementos de una matriz
x = seq (1 ,100 ,1.5 )
dim (x) # no funciona sobre vectores: equivalente a 'length' para las matrices
X/ 3 # ¡¡¡ATENCIÓN A CÓMO SE HACEN LAS OPERACIONES!!!
[,1] [,2] [,3]
[1,] 0.3333333 0.6666667 1
[2,] 1.3333333 1.6666667 2
[3,] 2.3333333 2.6666667 3
X^ 3 # potencia de una matriz (potencia de cada elemento)
[,1] [,2] [,3]
[1,] 1 8 27
[2,] 64 125 216
[3,] 343 512 729
3 * X-9 # combinación lineal de una matriz
[,1] [,2] [,3]
[1,] -6 -3 0
[2,] 3 6 9
[3,] 12 15 18
sqrt (X) # raíz cuadrada de cada elemento
[,1] [,2] [,3]
[1,] 1.000000 1.414214 1.732051
[2,] 2.000000 2.236068 2.449490
[3,] 2.645751 2.828427 3.000000
log (X) # logaritmo de cada elemento
[,1] [,2] [,3]
[1,] 0.000000 0.6931472 1.098612
[2,] 1.386294 1.6094379 1.791759
[3,] 1.945910 2.0794415 2.197225
exp (X) # exponencial de cada elemento
[,1] [,2] [,3]
[1,] 2.718282 7.389056 20.08554
[2,] 54.598150 148.413159 403.42879
[3,] 1096.633158 2980.957987 8103.08393
Una vez más se observa que se hacen elemento a elemento.
Otras posibilidades interesantes son los comandos diag , det y solve :
diag (X) # diagonal principal de una matriz
diag (diag (X)) # matriz diagonal
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 5 0
[3,] 0 0 9
diag (3 ) # matriz identidad del orden indicado
[,1] [,2] [,3]
[1,] 1 0 0
[2,] 0 1 0
[3,] 0 0 1
[,1] [,2] [,3]
[1,] 0 2 3
[2,] 4 4 6
[3,] 7 8 8
det (X) # determinante de una matriz
solve (X - diag (3 )) # inversa de una matriz
[,1] [,2] [,3]
[1,] -0.5000 0.25000 0.000
[2,] 0.3125 -0.65625 0.375
[3,] 0.1250 0.43750 -0.250
Algo habitual al aplicar un comando es que los resultados obtenidos sean realmente una lista de resultados. En este caso es interesante saber cómo acceder a cada uno de ellos:
eigen (X) # autovalores y autovectores de una matriz
eigen() decomposition
$values
[1] 1.611684e+01 -1.116844e+00 -1.303678e-15
$vectors
[,1] [,2] [,3]
[1,] -0.2319707 -0.78583024 0.4082483
[2,] -0.5253221 -0.08675134 -0.8164966
[3,] -0.8186735 0.61232756 0.4082483
$values
[1] 1.611684e+01 -1.116844e+00 -1.303678e-15
eigen (X)[[1 ]] + 1 # para poder hacer operaciones (con un simple corchete da error)
[1] 17.116844 -0.116844 1.000000
$vectors
[,1] [,2] [,3]
[1,] -0.2319707 -0.78583024 0.4082483
[2,] -0.5253221 -0.08675134 -0.8164966
[3,] -0.8186735 0.61232756 0.4082483
Algunas operaciones entre más de una matriz:
X/ Y # división elemento a elemento
[,1] [,2] [,3]
[1,] 1.000000 0.500000 0.4285714
[2,] 2.000000 1.000000 0.7500000
[3,] 2.333333 1.333333 1.0000000
X* Y # producto elemento a elemento
[,1] [,2] [,3]
[1,] 1 8 21
[2,] 8 25 48
[3,] 21 48 81
X%*% Y # producto matricial
[,1] [,2] [,3]
[1,] 14 32 50
[2,] 32 77 122
[3,] 50 122 194
[,1] [,2] [,3]
[1,] 66 78 90
[2,] 78 93 108
[3,] 90 108 126
X[2 ,2 ] = 0
solve (crossprod (X))%*% t (X)%*% Y # nos suena?
[,1] [,2] [,3]
[1,] 3.774758e-15 -1.500000e+00 -3.000000e+00
[2,] -4.996004e-16 -1.554312e-15 -2.442491e-15
[3,] 3.333333e-01 1.833333e+00 3.333333e+00
solve (crossprod (X))%*% crossprod (X,Y)
[,1] [,2] [,3]
[1,] 7.105427e-15 -1.500000e+00 -3.000000e+00
[2,] -3.330669e-16 -1.554312e-15 -2.220446e-15
[3,] 3.333333e-01 1.833333e+00 3.333333e+00
t (X) # traspuesta de una matriz
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 0 8
[3,] 3 6 9
t (X) == Y # operadores lógicos
[,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE FALSE TRUE
[3,] TRUE TRUE TRUE
Finalmente, también se pueden definir vectores con el comando matrix :
x = matrix (1 : 3 , c (1 ,3 )) # vector fila
x
[,1] [,2] [,3]
[1,] 1 2 3
# X%*%x # las dimensiones no coinciden
y = matrix (1 : 3 , c (3 ,1 )) # vector columna
y
[,1]
[1,] 1
[2,] 2
[3,] 3
[,1]
[1,] 14
[2,] 22
[3,] 50
crossprod (X,y) # ¡ojo! t(X)%*%y
[,1]
[1,] 30
[2,] 26
[3,] 42
crossprod (t (X),y) # t(t(X))%*%y = X%*%y
[,1]
[1,] 14
[2,] 22
[3,] 50