Vecteurs

x  = seq(1, 2, 0.05)
length(x)

y <- c(0,8,-3,1,4)
length(y)

z <- -10:10
z[1:10]

a = rep(2, 10)
b = rep(1:3, 10)

Matrices

# un vecteur 
x <- c(1,0,-3,4)
x

# une matrice
B <- matrix(c(2,0,2.4,0,-8,1,5,3,6,4,-4,4),byrow=TRUE,nrow=3,ncol=4)
B

# la même matrice  
B <- matrix(c(2,0,2.4,0,-8,1,5,3,6,4,-4,4),byrow=TRUE,nrow=3)
B

# accès aux éléments d'une matrice 
B[1,3]

B[3,]

B[,2]

B[1,2:3]

B[1,c(2,3)]

# l'option byrow = FALSE 
C <- matrix(data=c(2,0,2.4,0,-8,1,5,3,6,4,-4,4),byrow=FALSE,nrow=3)
C 
print(C)
dim(C)

# déclaration 
A <- matrix(c(1,2,3,4,5,6,7,8,9),byrow=TRUE,nrow=3,ncol=3)
A

A <- matrix(1:9,byrow=TRUE,nrow=3,ncol=3)
# extraction de la diagonale 
diag(A)

# on peut affecter la diagonale à un vecteur
d <- diag(A); d

# on peut déclarer une matrice diagonale
diag(c(3,0,4))

# affectation
A <- diag(c(1,-1,4))
A

# création d'une matrice identité 
diag(3)

# on peut sélectionner des éléments à l'aide de lower.tri() et upper.tri()
A <- matrix(c(1,2,3,4,1,2,1,1,3),nrow=3,byrow=T)
A
# avec la diagonale
lower.tri(A, diag=TRUE)
# ou
lower.tri(A,diag=FALSE)
# ça sert à ce genre d'opérations
A[lower.tri(A,diag=FALSE)] <- 0

A <- matrix(c(1,4,-3,2),nrow=2,byrow=T)
B <- matrix(c(1,4,-3,0),nrow=2,byrow=T)

# on peut tester si ==
identical(A,B)
X <- matrix(c(1,4,-3,2),nrow=2,byrow=T)
# tester l'égalité 
identical(A,X)

# comparaison élément par élement
A == B

# affectation 
X = 3

# comparaison 
A > B

Opérations de bases sur les matrices

# définir les matrices A, B and C
A <- matrix(c(-1,2,3,4),nrow=2,byrow=T)
B <- matrix(c(0.5,8,3.5,1),nrow=2,byrow=T)


# calculer l'addition A + B
A + B

# la différence A - B
C = A - B

# opération de transposition 
A <- matrix(1:12,nrow=3,byrow=T)
A

# la transposé
t(A)

# le cas d'un vecteur
x <- c(3,7,4,1,0,-4)

# transposer x si c'est un vecteur ligne 
t(x)
t(t(x))

# multiplication par un scalaire 
A <- matrix(1:6,nrow=2,byrow=T)
# calculer 3*A
3*A
# ou 
A*3

Produit scalaire et produit matriciel

# exemple R d'un produit scalaire
# déclarer deux vecteurs x et y
x <- c(30,5.5,10)
y <- c(45,100,50)
# operateur * : element-wise multiplication
x*y

# multiplication de matrices : operateur %*%
x%*%y

# noter que le produit scalaire x%*%y donne une matrice 1 x 1 
class(x%*%y)

# on veut revenir à un format numérique
drop(x%*%y)
class(drop(x%*%y))

sum(x*y)

# produit extérieur de deux vecteurs
a <- c(1,0,-2)
b <- <- c(-3,5,0,1)
outer(a,b)
# ou
a%o%b 

# on peut passer par un produit matriciel
a1=matrix(c(1,0,-2),ncol=1)
b1=matrix(c(-3,5,0,1),nrow=1)
a1%*%b1

# multiplication matricielle 
A <- matrix(c(1,0,2,-1,4,3),byrow=T,ncol=3)
B <- matrix(c(0,6,1,5,1,1,0,7,3,4,4,3),byrow=T,ncol=4)
C <- A%*%B
C
dim(C)

# commutativité 
A <- matrix(c(1,2,3,4),byrow=T,ncol=2)
B <- matrix(c(5,6,7,8),byrow=T,ncol=2)
C1 <- A%*%B
C1
C2 <- B%*%A
C2
identical(C1,C2)

Un petit exemple : chaine de Markov

Comme exemple d’application de la multiplication matricielle, considérons le comportement de vote. Supposons que les électeurs soient répartis entre trois partis démocrates (D), républicains (R) et libéraux (L).

À chaque élection, chaque électeur peut voter le même parti qu’aux élections précédentes ou voter pour un autre parti. Ce processus peut être décrit par une matrice de transition \(\mathbf P\) qui contient les probabilités de transitions particulières. Dans la matrice de transition, les entrées de chaque vecteur (ligne) sont positives et leur somme est à \(1\). Supposons que la matrice de transition du vote des électeurs est donnée par

\[\mathbf P = \begin{bmatrix} 0.7 & 0.2 & 0.1 \\ 0.1 & 0.8 & 0.1\\ 0.3 & 0.3 & 0.4 \end{bmatrix}\]

D - Sur la première ligne de la matrice de transition, nous pouvons lire que lors des prochaines élections, 70 % de ceux qui ont voté démocrates aux élections précédentes,voteront à nouveau démocrates, 20% voteront pour les républicains et 10% voteront pour les libéraux.

R - La deuxième ligne indique les probabilités de transition pour ceux qui ont voté pour les républicains. Autrement dit, 10% de ceux qui ont voté pour les républicains aux élections précédentes, voteront pour les démocrates, 80% voteront à nouveau les républicains et 10% des votes pour les libéraux.

L - De même, la troisième ligne de la matrice de transition contient les probabilités de transition pour ceux qui ont voté libéraux lors des élections précédentes.

Supposons que lors des élections précédentes, les électeurs étaient répartis comme suit

Ces pourcentages forment un vecteur d’état initial \(v_0\) donné par

\[v^t_0 = \begin{bmatrix} 0.55 & 0.40 & 0.05 \end{bmatrix} \]

Le résultat prédit des prochaines élections peut maintenant être calculé en utilisant la matrice de transition \(\mathbf P\) et le vecteur des états initiaux \(v_0\), comme suit \[v^t_0\mathbf P = \begin{bmatrix} 0.55 & 0.40 & 0.05 \end{bmatrix} \begin{bmatrix} 0.7 & 0.2 & 0.1 \\ 0.1 & 0.8 & 0.1\\ 0.3 & 0.3 & 0.4 \end{bmatrix} = \begin{bmatrix} 0.440 & 0.445 & 0.115 \end{bmatrix} \]

library(expm) 
## sous R
P <- matrix(c(0.7,0.2,0.1,0.1,0.8,0.1,0.3,0.3,0.4),ncol=3, byrow = T)
v0 <- t(c(0.55,0.4,0.05))

# un pas
v1 <- v0%*%P

# un second pas
v2 <- v1%*%P

# puissance d'une matrice
P%^%2

# c'est la même chose que le produit matriciel PxP
P%*%P

# puissance 40
P%^%40

# puissance 50
P%^%50