TD2 : Les matrices

Les matrices sont, comme en mathématiques, des tableaux de données. Attention, comme pour les vecteurs les matrices ne contiendront que des éléments du même type (numérique, texte, booléen).

Toutes les commandes seront enregistrées dans un fichier script nommé TD2.R.

1 Définition

  • Une matrice se définit simplement avec la fonction matrix().
A <- matrix(c(1,2,3,
           2,1,-1,
           -3,-1,1),nrow=3)
A
     [,1] [,2] [,3]
[1,]    1    2   -3
[2,]    2    1   -1
[3,]    3   -1    1
  • Les matrices diagonales peuvent se définir avec la fonction diag().
B <- diag(x=c(1,2,3))
B
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    2    0
[3,]    0    0    3
  • La dimension d’une matrice est donnée par dim().
dim(A)
[1] 3 3

Le résultat est un vecteur ayant deux éléments : le nombre de lignes et le nombre de colonnes.

2 Indexation des éléments d’une matrice

  • Les éléments d’une matrice sont identifiés par un numéro de ligne et de colonne entre crochets A[i,j].
A[1,2]
[1] 2
# première ligne de A 
A[1,]
[1]  1  2 -3
# première colonne de A
A[,1]
[1] 1 2 3
  • Comme pour les vecteurs, on peut alors modifier un ou plusieurs coefficient de la matrice.
A[1,1] <- -1
A
     [,1] [,2] [,3]
[1,]   -1    2   -3
[2,]    2    1   -1
[3,]    3   -1    1
A[2,] <- c(-10,-20,-30)
A
     [,1] [,2] [,3]
[1,]   -1    2   -3
[2,]  -10  -20  -30
[3,]    3   -1    1
A[1:2,3] <- c(1000,2000)
A
     [,1] [,2] [,3]
[1,]   -1    2 1000
[2,]  -10  -20 2000
[3,]    3   -1    1

3 Opérations sur les matrices

  • Si deux matrices sont de même dimension, on peut naturellement effectuer des opérations terme à terme (addition, multiplication, puissance,…).
A1 <- matrix(c(1,1,1,
                -1,-1,-1,
                2,2,2),nrow = 3)
A1
     [,1] [,2] [,3]
[1,]    1   -1    2
[2,]    1   -1    2
[3,]    1   -1    2
A2 <- matrix(c(1,2,3,
               4,5,6,
               7,8,9),nrow = 3,byrow = TRUE)
A2
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
A1+A2
     [,1] [,2] [,3]
[1,]    2    1    5
[2,]    5    4    8
[3,]    8    7   11
A1*A2
     [,1] [,2] [,3]
[1,]    1   -2    6
[2,]    4   -5   12
[3,]    7   -8   18
A1^A2
     [,1] [,2] [,3]
[1,]    1    1    8
[2,]    1   -1   64
[3,]    1    1  512
  • La transposée d’une matrice s’obtient avec la fonction t().
t(A1)
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]   -1   -1   -1
[3,]    2    2    2
  • La multiplication de deux matrices, au sens mathématique du terme, s’effectue avec %*%.
A1%*%A2
     [,1] [,2] [,3]
[1,]   11   13   15
[2,]   11   13   15
[3,]   11   13   15
  • Les fonctions colSums() et rowSums() permettent de calculer la somme sur les colonnes et sur les lignes d’une matrice.
colSums(A1)
[1]  3 -3  6
rowSums(A1)
[1] 2 2 2
  • Enfin, comme avec les vecteurs, on peut effectuer des tests sur les matrices.
B==0
      [,1]  [,2]  [,3]
[1,] FALSE  TRUE  TRUE
[2,]  TRUE FALSE  TRUE
[3,]  TRUE  TRUE FALSE

4 Exercices

4.1 Exercice 1

  1. Générer un vecteur fillmat contenant 250 valeurs tirées selon une loi uniforme continue de paramètres 0 et 10 grâce à la fonction runif().
Voir la correction
set.seed(6351) # Initialisation de la graine pour les nombres pseudo-aléatoires
fillmat <- runif(250,0,10)
  1. Créer une matrice Mesures de 50 lignes et 5 colonnes contenant les valeurs de fillmat. Les colonnes seront nommées Mesure1,…, Mesure5 (on utilisera la fonction colnames()).
Voir la correction
Mesures <- matrix(fillmat,nrow = 50)
colnames(Mesures) <- paste("Mesure",1:5,sep="")
  1. Créer un vecteur Groupe de taille 50 contenant des valeurs entières aléatoires entre 1 et 5 (fonction sample()). On interprétera Groupe comme le groupe d’appartenance des 50 lignes de Mesures. Ajouter cette colonne à la matrice Mesures.
Voir la correction
Groupe <- sample(x=1:5,size=50,replace = TRUE)
Mesures <- cbind(Mesures,Groupe)
  1. Combien de lignes appartiennent au groupe n°2 ?
Voir la correction
sum(Mesures[,6] ==2)

sum(Mesures[,"Groupe"]==2) # Autre possibilité car les colonnes sont nommées
  1. Afficher le numéro des lignes appartenant au groupe n°2.
Voir la correction
which(Mesures[,"Groupe"]==2)
  1. Afficher les lignes de Mesures correspondant au groupe n°2.
Voir la correction
Mesures[which(Mesures[,"Groupe"]==2),]
  1. Déterminer combien Mesures contient de valeurs inférieures à 5 (on exclura la colonne Groupe du comptage).
Voir la correction
sum(Mesures[,-6] <5)  # On retire ici la 6ème colonne, i.e. la colonne Groupe
  1. Calculer la moyenne des valeurs de Mesures correspondant au groupe n°4.
Voir la correction
mean(Mesures[which(Mesures[,"Groupe"]==4),-6]) # On effectue la moyenne de toutes les valeurs
colMeans(Mesures[which(Mesures[,"Groupe"]==4),-6]) # On effectue ici la moyenne colonne par colonne
  1. Même question, mais pour les 3 premières colonnes uniquement.
Voir la correction
mean(Mesures[which(Mesures[,"Groupe"]==4),1:3]) # On effectue la moyenne de toutes les valeurs
colMeans(Mesures[which(Mesures[,"Groupe"]==4),1:3]) # On effectue ici la moyenne colonne par colonne
  1. Appliquer à Mesures les fonctions dim(), ncol() et nrow(). A quoi correspondent ces nombres ?
Voir la correction
dim(Mesures) # Dimensions (nbre lignes et nbre colonnes) de la matrice
ncol(Mesures) # Nbre de colonnes
nrow(Mesures) # Nbre de lignes

4.2 Exercice 2

  1. Créer la matrice mat avec les instructions
values <- c(1,0,3,4,5,5,0,4,5,6,3,4,0,1,3,2)
mat <- matrix(values,nrow=4)
  1. Créer le vecteur vec composé des éléments diagonaux de mat.
Voir la correction
vec <- diag(mat)
  1. Créer la matrice submat contenant les 2 premières ligens de mat, et la matrice submat2 contenant les deux dernières colonnes de mat. Quelles sont les dimensions de ces matrices ?
Voir la correction
submat <- mat[1:2,]
submat2 <- mat[,3:4]
dim(submat)  # Matrice 2x4
dim(submat2) # Matrice 4x2
  1. Créer la matrice smallmat composée des colonnes de mat dont tous les éléments sont strictement inférieurs à 5.
Voir la correction
smallmat <- mat[,colSums(mat <5)==4]
  1. Créer ensuite la matrice notzero composée des lignes de mat dont tous les éléments sont non nuls.
Voir la correction
notzero <- mat[rowSums(mat !=0)==4,]
  1. Créer une matrice mat2 avec l’instruction :
mat2 <- matrix(1:16,nrow = 4)

puis comparer les instructions mat * mat2et mat %*% mat2.

Voir la correction
mat * mat2 # Le produit est effectué terme à terme
mat%*%mat2 # On effectue le produit matriciel