Programmer en R/Manipuler les matrices

Notion de matrice

modifier

Une matrice est un tableau en deux dimensions dont tous les éléments sont du même type. À l'instar des vecteurs, il ne s'agit pas ici de la notion algébrique de matrice, mais R dispose tout de même des opérateurs matriciels classiques. Pour R, un vecteur n'est pas la même chose qu'une matrice ligne ou colonne.

Initialisation d'une matrice ligne ou colonne

modifier

Une matrice colonne s'obtient avec la commande rbind (row bind, association de lignes) ; une matrice ligne s'obtient avec la commande cbind (column bind, association de colonnes).

> rbind(1 ,2 ,3)
     [,1]
[1,]    1
[2,]    2
[3,]    3
> cbind(1, 2, 3)
     [,1] [,2] [,3]
[1,]    1    2    3

On peut initialiser une matrice avec des éléments tous identiques, avec la commande rep() (replicate). Par exemple, pour créer des matrices nulles :

> rbind(rep(0, 3))
     [,1] [,2] [,3]
[1,]    0    0    0

> cbind(rep(0, 3))
     [,1]
[1,]    0
[2,]    0
[3,]    0

on remarque que l'utilisation de la commande rep() « inverse » le comportement ligne/colonne, puisque rbind() met en ligne un seul élément (qui est un vecteur), et que cbind() met en colonne un seul élément (qui est un vecteur).

Initialisation d'une matrice rectangulaire

modifier

Les matrices sont créées à partir d'un vecteur : les valeurs sont prises une par une pour remplir le tableau, colonne par colonne.

Avec la commande rbind(), on associe plusieurs vecteurs, chaque vecteur étant une ligne du tableau. Avec la commande cbind(), on associe plusieurs vecteurs, chaque vecteur étant une colonne du tableau.

> rbind(c(1, 2, 3), c(4, 5, 6))
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
> cbind(c(1, 2, 3), c(4, 5, 6))
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6

On utilise également la commande matrix(). L'argument data (1er argument par défaut) est le vecteur de données, l'argument nrow (2e par défaut) indique le nombre de lignes, et l'argument ncol (3e par défaut) indique le nombre de colonnes.

> matrix(data = 1:12, nrow = 3, ncol = 4)
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> matrix(1:12, 3, 4)
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

La syntaxe totale de la fonction matrix est la suivante :

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
       dimnames = NULL)

Le paramètre data est un vecteur contenant les éléments de la matrice. Lorsque le vecteur contient moins d'éléments que la matrice à construire, les données du vecteur sont utilisées plusieurs fois, et lorsqu'il contient plus d'éléments, les éléments en trop sont ignorés. La dimension de la matrice est déterminée par nrow (nombre de lignes) et ncol (nombre de colonne). Lorsque byrow vaut TRUE, la matrice est complétée ligne par ligne, dans le cas contraire, colonne par colonne.

> a <- matrix (c(1,2,3,4), 2, 2, byrow=TRUE)
> a
     [,1] [,2]
[1,]    1    2
[2,]    3    4

Pour initialiser une matrice nulle, on peut également utiliser rep() :

> n1 <- 3
> n2 <- 3
> a <- matrix (rep(0, n1*n2), n1, n2)
> a
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0

Accès aux éléments d'une matrice

modifier

De même que pour les vecteurs, les indices vont de 1 à nrow et de 1 à ncol.

  • a[i, j] désigne l'élément de la ligne i et de la colonne j de la matrice a ;
  • a[i, ] désigne le vecteur correspondant à la i-ième ligne de la matrice a ;
  • a[, j] désigne le vecteur correspondant à la j-ième colonne de la matrice a ;
> a[2,1]
[1] 3
> a[1,]
[1] 1 2
> a[,1]
[1] 1 3

On peut également, pour les indices, utiliser des vecteurs d'indice, ou bien une matrice booléenne.

> a[c(1, 2), c(3, 4)]
     [,1] [,2]
[1,]    7   10
[2,]    8   11
> indices <- a>5
> indices
      [,1]  [,2] [,3] [,4]
[1,] FALSE FALSE TRUE TRUE
[2,] FALSE FALSE TRUE TRUE
[3,] FALSE  TRUE TRUE TRUE
> a[indices]
[1]  6  7  8  9 10 11 12

On remarque que la dernière solution renvoie un vecteur et non une matrice.

Enfin, on peut indexer une matrice par un seul indice ; R défile alors les colonnes de haut en bas, et de gauche à droite :

> a
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> a[4]
[1] 4

Le rapport entre l'indice unique ket la paire d'indices (i, j) est :

j <- k%/%nrow(a) + 1
i <- k%%nrow(a)
k = (j - 1)*nrow(a) + i

Arithmétique des matrices

modifier

Opérations terme à terme

modifier

Il est possible d'additionner +, soustraire -, multiplier * et diviser des matrices /. Toutes ces opérations sont effectuées entre les coefficients correspondants des matrices. En particulier pour la multiplication, il ne s'agit pas de la multiplication matricielle telle qu'elle est définie en mathématiques, comme le montre l'exemple suivant.

Matrice a Matrice b
> a = matrix (c(1,2,3,4,5,6), 2, 3)
> a
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> b = matrix (c(5,1,3,4,1,0), 2, 3)
> b
     [,1] [,2] [,3]
[1,]    5    3    1
[2,]    1    4    0
Opération Description Résultat
a+b
Addition terme à terme
     [,1] [,2] [,3]
[1,]    6    6    6
[2,]    3    8    6
a-b
Soustraction terme à terme
     [,1] [,2] [,3]
[1,]   -4    0    4
[2,]    1    0    6
a*b
Multiplication terme à terme
     [,1] [,2] [,3]
[1,]    5    9    5
[2,]    2   16    0
a/b
Division terme à terme
     [,1] [,2] [,3]
[1,]  0.2    1    5
[2,]  2.0    1  Inf

Opérations algébriques

modifier

Soient A et B deux matrices.

La multiplication matricielle s'obtient avec l'opérateur %*% :

A %*% B

Cette syntaxe permet également de multiplier un vecteur par une matrice.

Le déterminant s'obtient avec la commande determinant() :

determinant(A)

La transposition de la matrice A se fait avec

aperm(A)

Si A et B sont des matrices ligne (mais pas des vecteurs au sens de R), on peut donc calculer le produit scalaire

A %*% aperm(B)

et si ce sont des matrices colonne, avec

aperm(A) %*% B

et ainsi, la norme d'une matrice ligne ou colonne est

sqrt(A %*% aperm(A))
# ou bien
sqrt(aperm(A) %*% A)

Si A est une matrice régulière (carrée inversible), on a son inverse avec

solve(A)

L'extraction des valeurs et vecteurs propres se fait avec

x = eigen(A)
x$values # valeurs propres
x$vectors # vecteurs propres