Les Tableaux 2D Les Tableaux 2D
Les Tableaux 2D Les Tableaux 2D
1
29/03/16
Image = tableau 2D de pixels
L'ami du tableau 2D : la double-‐boucle imbriquée
Un premier exemple
Avec
un
tableau
1D
:
00000011100101000111000000
t : tableau[25] d'entiers = [0,0,0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,1,1,1,0,0,0,0,0,0]
declare
img : tableau[5,8] d'entiers
// une image rectangulaire
Avec
un
tableau
2D
:
N/B
niveaux
de
gris
// de 5 lignes, 8 colonnes
00000
0
0
0
0
0
i : entier
// indice de parcours des lignes
01110
0
128
128
128
0
j : entier
// indice de parcours des colonnes
01010
0
128
0
128
0
01110
0
128
128
128
0
debut
00000
0
0
0
0
0
pour i de 0 à 4 faire
// pour chaque ligne : il y en a 5
pour j de 0 à 7 faire
// pour chaque colonne : il y en a 8
img[i , j] = 128
// un pixel de gris
t : tableau[5,5] d'entiers = [ [0,0,0,0,0] , [0,1,1,1,0], [0,1,0,1,0],
finpour
// j'ai fini toutes les colonnes donc une
[0,1,1,1,0] , [0,0,0,0,0] ]
ligne
-‐
2
indices
:
ligne
/
colonne
finpour
// j'ai fini toutes les lignes donc l'image ....
-‐
t[1, 2] == 1 et
t[4,4] == 0
fin
//... comporte 40 pixels gris
-‐
t[3, 10] : tableau
rectangulaire
de
3
lignes
et
10
colonnes
29/03/16
Algo
2.
L1
math-‐info.
PhL
5
29/03/16
Algo
2.
L1
math-‐info.
PhL
6
D'abord
bien
comprendre
la
double
boucle
imbriquée
Parcours
"en
ligne
Seul
le
parcours
Parcours
"en
colonne
d'abord"
:
ligne/colonne
d'abord"
:
indice
i,
puis
indice
j
du
tableau
est
indice
j,
puis
indice
i
permuté
1
-‐2
-‐3
4
1
-‐3
5
-‐7
9
5
-‐6
-‐2
4
-‐6
8
-‐10
-‐7
8
9
-‐10
29/03/16
Algo
2.
L1
math-‐info.
PhL
7
29/03/16
Algo
2.
L1
math-‐info.
PhL
8
2
29/03/16
29/03/16 Algo 2. L1 math-‐info. PhL 9 29/03/16 Algo 2. L1 math-‐info. PhL 10
255
Tout gris c'est parfois triste ...
Tout gris c'est parfois triste ...
192
128
Modifions
l'algo
de
créa;on
de
declare
L'algo
ci-‐contre
donne
:
l'image
grise
pour
obtenir
ça
à
64
img : tableau[5,8] d'entiers
// une image rectangulaire
// de 5 lignes, 8 colonnes
0
i : entier
// indice de parcours des lignes
1.
Principe
de
l'algorithme
de
remplissage
en
5
niveaux
de
gris
:
j : entier
// indice de parcours des colonnes
-‐
remplir
chaque
ligne
du
même
niveau
de
gris
valeurs
debut
-‐
2
choix
symétriques
:
des
gris
pour i de 0 à 4 faire
// pour chaque ligne : il y en a 5
Aben;on
:
les
images
sont
souvent
indicées
pour j de 0 à 7 faire
// pour chaque colonne : il y en a 8
"à
l'inverse"
des
matrices
img[i , j] = 128
// un pixel de gris
finpour
// j'ai fini toutes les colonnes donc une ligne
.
du
haut
vers
le
bas
:
ligne
0
à
ligne
4
finpour
// j'ai fini toutes les lignes donc l'image ....
.
du
bas
vers
le
haut
:
ligne
4
à
ligne
0
fin
//... comporte 40 pixels gris
2.
Pe;te
difficulté
arithmé;que
:
comment
partager
la
plage
de
gris
0..255
en
5
gris
répar;s
de
façon
équilibrée
?
Essayons
avec
les
8
valeurs
0
1
2
3
4
5
6
7
.
on
prend
les
2
extrêmes
:
0,
7
(noir,
blanc)
0
1
2
3
4
5
6
7
.
il
reste
5
valeurs
répar;es
de
1
à
6
et
on
veut
3
autres
valeurs
de
sépara;on
Modifions
l'algo
de
créa@on
de
.
choix
équidistant
impossible
à
choix
arbitraire
:
par
exemple
2,
4,
6
qui
sont
équidistants
l'image
grise
pour
obtenir
ça
à
depuis
0
.
ce
qui
donne
0
2
4
6
7,
soit
0+2,
0+2+2,
0+2+2+2,
...
soit
:
0
+
i
x
2
avec
i
=
0,1,2,3
.
et
on
rajoute
7
à
la
fin.
Plus
généralement,
difficile
de
partager
un
nombre
pair
de
valeurs
en
un
nombre
impair
(>1)
de
tas
...
29/03/16
Algo
2.
L1
math-‐info.
PhL
11
29/03/16
Algo
2.
L1
math-‐info.
PhL
12
3
29/03/16
29/03/16
Algo
2.
L1
math-‐info.
PhL
15
29/03/16
Algo
2.
L1
math-‐info.
PhL
16
4
29/03/16
Matrices
Vocabulaire
-‐
matrice
=
tableau
2D
de
nombres
(en;ers,
flobants),
de
booléens
-‐
matrice
carrée
=
autant
de
lignes
que
de
colonnes
Des algorithmes sur les tableaux 2D
-‐
la
diagonale
de
la
matrice
A
:
A[i,i]
à
c'est
un
vecteur
Suite
d'exemples
en
interac;on
:
les
matrices
-‐
une
matrice
(carrée)
diagonale
:
A[i,
j]
=
0
pour
tous
les
i
≠
j
-‐
la
matrice
(diagonale)
iden;té
I
ou
Id(n)
=
des
1
sur
la
diagonale,
des
0
ailleurs
-‐
une
matrice
(carrée)
symétrique
:
A[i,j]
=
A[j,i]
-‐
...
29/03/16
Algo
2.
L1
math-‐info.
PhL
17
29/03/16
Algo
2.
L1
math-‐info.
PhL
18
29/03/16 Algo 2. L1 math-‐info. PhL 19 29/03/16 Algo 2. L1 math-‐info. PhL 20
5
29/03/16
Vérifier si une matrice donnée est symétrique ou non ?
Vérifier si une matrice donnée est symétrique ou
Entrée
:
une
matrice
(carrée)
A
non ?
Premières
solu;ons
à
base
de
boucles
pour
imbriquées
Sor;e
:
une
réponse
booléenne
-‐
choix
1
:
parcourir
toute
la
matrice
Principe
-‐
parcourir
chaque
valeur
A[i,j]
declare
-‐
la
comparer
à
A[j,i]
n : constante entier = ...
// paramètre taille de l'une matrice carrée
-‐
si
égalité,
on
con;nue
A : tableau[n, n] d'entiers = ...
// une matrice carrée 4x4 initialisée ...
-‐
sinon
la
réponse
est
connue
rep : booléen = VRAI
// la réponse : vrai ou faux
i, j : entier
// les indices de parcours ligne-colonne
debut
Premières
solu;ons
à
base
de
boucles
pour
imbriquées
pour i de 0 à n-1 faire
// pour chaque ligne
-‐
choix
1
:
parcourir
toute
la
matrice
pour j de 0 à n-1 faire
// pour chaque colonne
-‐
choix
2
:
parcourir
une
moi;é
de
la
matrice
:
triangulaire
supérieure
si A[i , j] != A[j, i] alors
// test de non-symétrie
rep = FAUX
finsi
Erreurs
possibles
finpour
// j'ai fini toutes les colonnes
-‐
l'entrée
n'est
pas
une
matrice
carrée
finpour
// j'ai fini toutes les lignes
fin
29/03/16
Algo
2.
L1
math-‐info.
PhL
21
29/03/16
Algo
2.
L1
math-‐info.
PhL
22
Vérifier si une matrice donnée est symétrique ou Vérifier si une matrice donnée est symétrique ou
non ?
non ?
Premières
solu;ons
à
base
de
boucles
pour
imbriquées
Premières
solu;ons
à
base
de
boucles
pour
imbriquées
-‐
choix
1
:
parcourir
toute
la
matrice
-‐
choix
2
:
ne
parcourir
que
la
par;e
triangulaire
supérieure
A[i,
j]
avec
i
<
j
declare
declare
n : constante entier = ...
n : constante entier = ...
A: tableau[n, n] d'entiers
= ...
A : tableau[n, n] d'entiers
= ...
rep : booléen = VRAI
Cet
algorithme
n'oublie
rien
rep : booléen = VRAI
Analyse
de
l'améliora;on
i, j : entier
-‐
double
boucle
imbriquée
à
n2
tests
internes
i, j : entier
-‐
oui
:
parcours
de
la
par;e
triangulaire
debut
mais
n'est
pas
op;mal
debut
supérieure
pour i de 0 à n-1 faire
-‐
n
tests
inu;les
:
pour i de 0 à n-1 faire
pour j de 0 à n-1 faire
la
diagonale
à
i=j
:
A[i,
i]
vs.
A[i,
i]
pour j de i+1 à n-1 faire
-‐
non
op@mal
encore
:
si A[i , j] != A[j, i] alors
-‐
n/2
test
inu;les
:
si A[i , j] != A[j, i] alors
si
A[1,2]
≠
A[2,1]
et
taille
n
grande
...
rep = FAUX
rep = FAUX
finsi
A[i,
j]
vs.
A[j,
i]
puis
A[j,
i]
vs.
A[i,
j]
finsi
beaucoup
de
tests/d'itéra;ons
inu;les
finpour
finpour
finpour
Améliora;on
finpour
fin
ne
parcourir
que
la
par;e
triangulaire
supérieure
fin
Exercice
:
écrire
un
algorithme
qui
réduit
le
nombre
d'itéra;ons/comparaisons
29/03/16 Algo 2. L1 math-‐info. PhL 23 29/03/16 Algo 2. L1 math-‐info. PhL 24
6
29/03/16
A[i, j] = A[j, i]
A[j, i] = tmp
finpour
Algo
finpour
PhL
29/03/16
Algo
2.
L1
math-‐info.
PhL
27
29/03/16
fin
2.
L1
math-‐info.
28
7
29/03/16
Calculer un produit matrice x matrice
j
Calculer un produit matrice x matrice
declare
Exercice
facile
pour
se
détendre
A: tableau[4, 2] d'entiers = [ [1, 1], [2, 3], [1, -1], [0,-2] ]
B: tableau[2, 3] d'entiers = [ [1, 2, 3], [-2, 0,-4] ]
k -‐
expliciter
la
suites
des
indices
i,j,k
en
C: tableau[4, 3] d'entiers
déroulant
le
produit
matrice
x
matrice
ci-‐
declare
i, j, k : entier
// itérateurs
A: tableau[4, 2] d'entiers = ....
contre.
B: tableau[2, 3] d'entiers = ....
i
// C est mise à zéro
debut
C : tableau[4, 3] d'entiers =
i, j, k : entier
pour i de 0 à 3 faire
// exemple d'initialisation
Remarques
debut
pour j de 0 à 2 faire
// Bien voir pourquoi
-‐
l'ordre
du
parcours
de
C
est
arbitraire
// C est mise à zéro
C[i, j] = 0
// la mise à zéro est nécessaire !
pour i de 0 à 3 faire
i
finpour
les
boucles
"i"
et
"j"
peuvent
être
à
pour j de 0 à 2 faire
finpour
permutées
C[i, j] = 0
finpour
// calcul de C=A*B
finpour
pour i de 0 à 3 faire
// ligne i
Ques;on
pour j de 0 à 2 faire
// colonne j
Autre
solu;on
pour
-‐
l'ordre
de
l'accumula;on
dans
C[i,j]
est
aussi
// calcul de C=A*B
pour k de 0 à 1
// parcours k
ini;aliser
C[i,
j]
avant
arbitraire
(au
moins
dans
IR)
pour i de 0 à 3 faire
C[i, j] = C[i,j] + A[i,k]*B[k,j]
// vu ?
à
la
boucle
sur
"k"
peut
être
aussi
permutée
pour j de 0 à 2 faire
finpour
l'accumula;on
de
la
pour k de 0 à 1
finpour
boucle
sur
k
?
avec
celles
sur
"i"
ou
"j"
C[i, j] = C[i,j] + A[i,k]*B[k,j]
finpour
finpour
fin
finpour
6
ordres
possibles
pour
ce
produit
finpour
fin
i-‐j-‐k,
i-‐k-‐j,
j-‐i-‐k,
k-‐i-‐j,
k-‐j-‐i,
j-‐k-‐i
29/03/16
Algo
2.
L1
math-‐info.
PhL
31
29/03/16
Algo
2.
L1
math-‐info.
PhL
32
8
29/03/16
Calculer un produit matrice x matrice
Calculer un produit matrice x matrice
L'écrire
sous
forme
d'une
fonc;on
L'écrire
sous
forme
d'une
procédure
Entrées
:
une
matrice
A
de
taille
m
x
n
et
une
matrice
B
de
taille
n
x
p
(de
flobants)
Entrées
:
une
matrice
A
de
taille
m
x
n
et
une
matrice
B
de
taille
n
x
p
Sor;e
:
une
matrice
C
de
taille
m
x
p
(de
flobants)
Sor;e
:
une
matrice
C
de
taille
m
x
p
Problèmes
de
conven;on
procedure Produit(m: in entier, n: in entier, p: in entier
-‐
une
fonc;on
peut
retourner
un
tableau
:
oui/non
?
A: in tableau[m,n] de flottants,
à
ce
qui
implique
que
l'affecta;on
A = B est
autorisée
pour
A
et
B,
B: in tableau[n,p] de flottants,
C: inout tableau[m,p] de flottants)
Déjà
:
il
faut
2
tableaux
de
même
type
d'éléments
et
de
même
taille
...
Erreurs
possibles
-‐
si
oui,
faut-‐il
préciser
la
taille
du
tableau
résultat
:
oui/non
?
Si
les
paramètres
effec;fs
ne
vérifient
pas
(m,
n)
x
(n,
p)
à
(m,
p)
fonction Produit(....) retourne tableau de flottants
-‐
contrôler
les
tailles
des
paramètres
effec;fs,
fonction Produit(....) retourne tableau[m,p] de flottants
-‐
puis,
arrêter
le
traitement
si
besoin
-‐
sinon,
une
procédure
convient.
29/03/16 Algo 2. L1 math-‐info. PhL 33 29/03/16 Algo 2. L1 math-‐info. PhL 34
9
29/03/16
29/03/16
Algo
2.
L1
math-‐info.
PhL
37
29/03/16
Algo
2.
L1
math-‐info.
PhL
38
29/03/16 Algo 2. L1 math-‐info. PhL 39 29/03/16 Algo 2. L1 math-‐info. PhL 40
10
29/03/16
Retour sur les images en couleurs
Remarques sur les tableaux
Une
image
=
quadrillage
de
pixels
couleur
mul.dimensionnels
img : tableau[1024,768] de
...
pixels
couleurs
En
pra;que,
les
tableaux
nD
sont
représentés
comme
des
vecteurs
-‐
déroulage/dépliage
selon
les
lignes
OU
les
colonnes
1
pixel
couleur
=
triplet
d'en;ers
RGB
1
2
3
exemple
:
[255,
0,
0
]
=
[255,255,0]
=
[127,127,127]=
4
5
6
pixel : tableau[3] d'entiers
-‐
ligne
vs.
colonnes
:
dépend
du
langage
de
programma;on
C
:
par
ligne
Une
solu;on
:
le
tableau
3D
1
2
3
4
5
6
imgCouleur : tableau[1024, 768, 3] d'entiers
imgCouleur[i, j, 0] à composante R du pixel [i,j]
Fortran
:
par
colonne
1
4
2
5
3
6
imgCouleur[i, j, 2] à composante B du pixel [i,j]
-‐
3
indices
:
ini;alisa;on/lecture/affichage
avec
triple
boucle
pour
Les
indices
mul;ples
sont
une
commodité
de
nota;on
à
s'en
imbriquées
servir
!!!!
29/03/16
Algo
2.
L1
math-‐info.
PhL
41
29/03/16
Algo
2.
L1
math-‐info.
PhL
42
Ce qui reste à présenter sur les tableaux
Ce qui reste à présenter sur les tableaux
Vu
:
tableau
sta;que
Vu
:
tableau
la
taille
du
tableau
est
fixé
une
fois
pour
toute
lors
de
sa
déclara;on
un
tableau
regroupe
des
objets
de
même
type
(ce
qui
ne
veut
pas
dire
qu'il
soit
ini;alisé)
on
peut
être
amené
à
réserver
plus
de
place
que
nécessaire
ses
éléments
sont
accédés
par
les
indices
Pas
vu
:
tableau
dynamique
ou
redimensionnable
Pas
vu
:
enregistrement
la
taille
du
tableau
n'est
pas
précisée
lors
de
sa
déclara;on
structure
de
données
qui
regroupe
des
valeurs
de
type
différents
mais
il
existe
une
fonc;on
spéciale
pour
fixer
la
taille
de
la
mémoire
chaque
valeur
est
appelé
un
champ
nécessaire
au
stockage
du
contenu
du
tableau
à
alloca;on
dynamique
de
mémoire
un
champ
est
accédé
par
son
nom
et
une
nota;on
pointée
(souvent)
(et
une
autre
fonc;on
pour
libérer
cebe
"place
mémoire"
si
on
n'en
n'a
plus
besoin)
En
pra;que,
ces
tableaux
ne
sont
pas
stockés
dans
la
même
zone
mémoire
29/03/16
Algo
2.
L1
math-‐info.
PhL
43
29/03/16
Algo
2.
L1
math-‐info.
PhL
44
11
29/03/16
Les tableaux 1D, 2D et plus ... en une diapo
Un
tableau
regroupe
des
objets
de
même
type
Ses
éléments
sont
accédés
par
des
indices
Autant
d'indices
que
de
dimensions
:
[i]
à
1D
[i,
j]
à
2D
[i,j,k]
à
3D
...
Les
indices
varient
entre
0
et
taille-‐1
(en
général)
La
taille
est
fixée
une
fois
pour
toute
à
la
déclara;on
(en
général)
Déclarer
n'est
pas
ini;aliser
Ini;aliser,
lire,
afficher
:
la
classique
boucle
pour
imbriquée
1
fois,
2
fois,
3
fois
...
Exemples
de
traitements
classiques
avec
des
images
et
des
matrices
Les
sous-‐programmes
avec
des
paramètres
tableaux
doivent
aussi
préciser
les
Synthèse sur les tableaux
tailles
correspondantes
en
une
diapo
Commencer
à
compter
le
nombre
d'itéra;ons
des
boucles
imbriquées,
et
leur
effet
sur
le
nombre
d'opéra;ons
ou
d'instruc;ons
alors
exécutées
Commencer
à
compter
la
place
mémoire
nécessaire
au
stockage
et
aux
traitements
29/03/16
Algo
2.
L1
math-‐info.
PhL
47
29/03/16
Algo
2.
L1
math-‐info.
PhL
48
12