Les tableaux - Page d`accueil

Transcription

Les tableaux - Page d`accueil
Lycée Fénelon
BCPST 1
Informatique
Cours
Les tableaux
A. Définition des tableaux
A. 1. Les tableaux monodimensionnels : les vecteurs . . . . . . . . . . . .
a) Définition d’un vecteur . . . . . . . . . . . . . . . . . . . . .
b) Consultation et modification des coordonnées d’un vecteur
A. 2. Les tableaux bidimensionnels : les matrices . . . . . . . . . . . . .
a) Définition d’une matrice . . . . . . . . . . . . . . . . . . . .
b) Consultation et modification des coefficients d’une matrice .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
3
4
5
5
6
B. Opérations sur les tableaux
B. 1. Opérations élément par élément .
a) Opérations arithmétiques
b) Opérations fonctionnelles
c) Concaténation . . . . . .
d) Extraction . . . . . . . . .
B. 2. Opérations matricielles . . . . . .
a) Opérations arithmétiques
b) Transposition . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
7
8
8
8
9
9
9
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Introduction
En informatique, il est souvent nécessaire de gérer un grand nombre de données. Pour que cellesci restent directement accessibles sans qu’il soit nécessaire de créer une variable pour chacune, il
est nécessaire de disposer d’un type de variable composée qui permette :
• de représenter simultanément plusieurs données ;
• de manipuler collectivement ou individuellement chacune d’entre elles.
Dans la plupart des langages de programmation, les tableaux (qui contiennent des éléments de
même nature) et les listes (qui peuvent contenir des éléments de natures différentes) jouent ce rôle.
Dans ce troisième chapitre consacré à la programmation, nous décrivons (en langage SCILAB)
la syntaxe de la structure de données de type tableau et nous apprenons à la manipuler.
2
A.
Définition des tableaux
A. 1.
Les tableaux monodimensionnels : les vecteurs
Un tableau à une dimension, que nous appelerons aussi vecteur, est un assemblage de données
homogènes, c’est-à-dire une suite finie d’éléments de même nature : on range des nombres avec des
nombres, des chaînes de caractères avec des chaînes de caractères, . . .
Dans cette structure de données, les éléments sont désignés par un numéro, que l’on appelle
indice. Cet indice est un entier compris entre 1 et n où n désigne le nombre d’éléments du tableau.
En SCILAB, les tableaux sont créés dynamiquement, c’est-à-dire qu’il n’est pas utile de préciser
à l’avance leur taille. En particulier, si l’on rajoute un élément dans un tableau préexistant, c’est
SCILAB qui se charge d’agrandir le tableau avant d’y placer le nouvel arrivant. Notons que cette
méthode de création dynamique des tableaux est couteuse en calculs et ralentit donc la machine.
a)
Définition d’un vecteur
Il existe deux types de tableaux à une dimension : les vecteurs lignes et les vecteurs colonnes.
Création d’un vecteur
Il existe plusieurs façons de définir un vecteur :
• Définition d’un vecteur en extension : On place les éléments entre crochets en séparant
les éléments par une virgule : [x1 , x2 , . . . , xn ] pour avoir un vecteur ligne et par un
point-virgule : [x1 ; x2 ; . . . ; xn ] pour obtenir un vecteur colonne.
• Définition d’un vecteur ligne en compréhension : Si les éléments du tableau forment
une suite arithmétique, on utilise l’instruction début : pas : fin (ou début : fin) que
nous avons déjà rencontrée dans les boucles. Ainsi, la commande [début : pas : fin]
désigne le vecteur ligne dont début est le premier élément, pas est le pas
d’incrémentation (qui vaut 1 par défaut) et fin est la valeur à ne pas dépasser.
• Définition coordonnées par coordonnées : On peut définir un vecteur u en affectant une
par une ses coordonnées. Ainsi, en écrivant u(1) = x1 , u(2) = x2 , . . ., u(n) = xn , on
fabrique un vecteur colonne, noté u, dont les éléments sont x1 , x2 , . . . , xn .
• Définition par concaténation : Pour ajouter l’élément x à un tableau u préexistant, on
peut écrire u = [u, x] pour l’ajouter à droite ou u = [x, u] pour l’ajouter à gauche.
Exercice 1.
Tapez à l’invite les expressions suivantes, suivies de la touche entrée :
--> u = [1, 3, 5], v = [1; 2], w = [9 : −2 : 1],
//
le pas peut être négatif
--> [ ]
//
[ ] désigne le tableau vide
--> a(1) = 1, a(2) = 4, a(3) = 9, a(5) = 25
--> u = [u, 9], w = [11, w]
Remarques :
• Lorsque début > fin, le vecteur [début : fin] est le tableau vide.
• Pour transformer un vecteur ligne u en un vecteur colonne ou l’inverse, on écrit u = u’ (car
le ’ désigne la transposition ; nous le verrons).
• Dans la définition coordonnées par coordonnées, si l’on oublie de préciser l’une des coordonnées, SCILAB l’affecte automatiquement à la valeur 0.
• Dans la définition par concaténation, il faut que le tableau existe déjà avant de lui ajouter
un élément : c’est une définition par récurrence. Si le tableau tab n’existe pas, on doit, avant
de lui ajouter un élément, le créer par initialisation en posant tab = [ ].
3
b)
Consultation et modification des coordonnées d’un vecteur
Une fois les données stockées dans un tableau, il est bien entendu nécessaire de pouvoir y
accéder pour en connaître les valeurs ou les modifier.
Accès aux éléments
Si zozo est le nom d’une variable de type vecteur (ligne ou colonne), la commande
length(zozo)
désigne le nombre d’éléments du tableau zozo. Dès lors, si n est ce nombre d’éléments
(c’est-à-dire n =length(zozo)), alors
zozo(1),
zozo(2),
...,
zozo(n)
désignent respectivement le premier, le deuxième, . . . , le n-ème élément du vecteur.
Attention ! Ne confondez pas l’indice d’une case et la valeur qu’elle contient : dans la notation
zozo(i), i désigne le numéro de la case et zozo(i) l’élément contenu dans la i-ème case du tableau
zozo.
Exercice 2.
Tapez à l’invite les expressions suivantes, suivies de la touche entrée :
--> u = [1, 3, 5, 7], v = [8 : −2 : 3]
--> length(u), length(v)
--> u(0)
--> u(2), v(3), u(length(u))
--> u(5) = 9, v(3) = 0
Remarques :
• Pour SCILAB, les vecteurs n’ont pas de case numérotée 0. C’est parfois un peu enquiquinant,
par exemple pour représenter une suite dont le premier terme s’appelle u0 .
• La dernière ligne de commande de l’exercice montre que l’on peut ajouter un élément à un
vecteur ou même réaffecter l’une de ses coordonnées.
Exercice 3.
Écrire une fonction sommevect, dont la variable est un vecteur u, qui calcule la somme des
éléments de u.
♦
Dans un fichier sommevect.sci, on écrit
function s = sommevect(u)
s = 0;
for i = 1 : length(u) do
s = s + u(i);
end
endfunction
En fait, cette fonction existe déjà dans SCILAB et s’appelle sum mais vous ne pouvez l’utiliser le jour
du concours que si vous savez écrire le script ci-dessus (dixit le jury).
4
♦
A. 2.
Les tableaux bidimensionnels : les matrices
Un tableau à deux dimensions n et m, que nous appelerons aussi matrice n × m, est un
assemblage de n vecteurs de même dimension m, c’est-à-dire une suite finie à deux indices constituée
d’éléments de même nature.
Dans cette structure de données, les éléments sont désignés par un couple de coordonnées
entières, que l’on appelle couple d’indice. Le premier indice correspond au numéro de la ligne et
le second désigne celui de la colonne.
Signalons que pour SCILAB, tout est de type tableau : un nombre est un tableau 1 × 1, un
vecteur ligne est un tableau 1 × n, un vecteur colonne est un tableau n × 1, une chaîne de caractère
est un vecteur dont les coordonnées correspondent aux codes ASCII des caractères de la chaîne, . . .
a)
Définition d’une matrice
L’encadré suivant vous explique comment associer la méthode de création des vecteurs lignes
avec celle des vecteurs colonnes pour définir un tableau à deux dimensions.
Création d’une matrice
Là encore, il existe plusieurs méthodes pour définir une matrice n × m (c’est-à-dire à n
lignes et m colonnes) :
• Définition d’une matrice en extension : On place ses éléments, appelés coefficients, entre crochets en séparant les éléments d’une même ligne par des virgules et les lignes
par des points virgules. Ainsi, la notation


[ x1,1 , x1,2 , x1,3 , x1,4 ;
x1,1 x1,2 x1,3 x1,4
désigne la matrice x2,1 x2,2 x2,3 x2,4  ·
x2,1 , x2,2 , x2,3 , x2,4 ;
x3,1 x3,2 x3,3 x3,4
x3,1 , x3,2 , x3,3 , x3,4 ]
Pour certaines lignes, on peut évidemment utiliser une définition en compréhension :
début : pas : fin.
• Définition coordonnées par coordonnées : On peut définir un tableau A en affectant
une par une ses coordonnées. Ainsi, en écrivant A(1, 1) = x1,1 , A(1, 2) = x1,2 , . . .,
A(n, m) = xn,m , on fabrique la matrice dont les coefficients sont les ai,j .
Exercice 4.
Tapez à l’invite les expressions suivantes, suivies de la touche entrée :
--> A = [1, 3, 5, 7; 9 : 2 : 15; 17, 19, 21, 23],
//
pas très lisible
--> B = [1, 2, 3;
-->
4, 5, 6;
//
plus long mais plus clair
-->
7, 8, 9]
--> C(1, 1) = 1, C(1, 2) = 1, C(1, 3) = 1, C(2, 2) = 1, C(2, 3) = 1, C(3, 3) = 1
--> D = [0, 1, 0;
-->
7, 8]
Remarques :
• Lorsqu’on crée une matrice par affectations successives de ses coefficients et que l’on oublie
de préciser l’un des coefficients, SCILAB l’affecte automatiquement à la valeur 0.
• La création de D se passe mal car les deux lignes n’ont pas le même nombre d’éléments.
SCILAB proteste en renvoyant le commentaire : Dimension ligne/colonne incohérente
5
b)
Consultation et modification des coefficients d’une matrice
L’accès aux coefficients d’une matrice est aussi simple que dans le cas des vecteurs sauf qu’il
nécessite l’usage d’un couple d’indice (comme à la bataille navale). On peut aussi accéder à une
ligne ou une colonne.
Accès aux coefficients, aux lignes et aux colonnes
Si ZOZO est une variable de type matrice de taille n × m, la commande
size(ZOZO)
stocke dans un vecteur ligne à deux cases le nombre de lignes (en première coordonnée) et
le nombre de colonnes (en seconde coordonnée) de la matrice ZOZO. Ainsi, size(ZOZO, 1) est
le nombre de lignes et size(ZOZO, 2) est le nombre de colonnes. De plus,
• ZOZO(i, j) désigne l’élément placé à l’intersection de la i-ème ligne et de la j-ème
colonne ;
• ZOZO(i, :) désigne la i-ème ligne ;
• ZOZO(:, j) désigne la j-ème colonne.
Exercice 5.
Tapez à l’invite les expressions suivantes, suivies de la touche entrée :
--> A = rand(3, 3)
--> A(1, 2), A(4, 1) = 10, A(1, 1) = 0
--> A(2, :), A(:, 3), A(3, :) = [−1, − 2, − 3], A(:, 1) = [ ]
--> length(A)
//
length fournit encore le nombre d’éléments
Remarques :
• rand(n, m) génère une matrice aléatoire de taille n × m dont les coefficients sont choisis
aléatoirement dans [0; 1].
• La deuxième ligne de commande montre que l’on peut ajouter un élément à une matrice ou
même réaffecter l’un de ses coefficients.
• L’instruction A(:, 1) = [ ] supprime la première colonne (en la remplaçant par une colonne
vide).
Exercice 6.
Écrire une fonction maxmat, dont la variable est une matrice A, qui détermine le plus grand
des éléments de A.
♦
Dans un fichier maxmat.sci, on écrit
function m = maxmat(A)
m = A(1, 1);
for i = 1 : size(A, 1) do
for j = 1 : size(A, 2) do
if m < A(i, j) then m = A(i, j), end;
end
end
endfunction
En fait, cette fonction existe déjà dans SCILAB et s’appelle max mais, là encore, vous ne pouvez
l’utiliser le jour du concours que si vous savez écrire le script correspondant.
6
♦
B.
Opérations sur les tableaux
Nous allons distinguer deux types d’opérations sur les tableaux : les opérations élément par
élément (que l’on appelle aussi opérations scalaires) et les opérations matricielles (qui ne sont pas
au programme et qu’il faut donc savoir programmer).
En pratique, nous utiliserons assez peu ces opérations.
B. 1.
Opérations élément par élément
La plupart des opérations classiques (addition, soustraction, multiplication, division, application d’une fonction, . . . ) s’étendent naturellement au cas des tableaux en s’appliquant simultanément à tous les éléments.
a)
Opérations arithmétiques
Les principales opérations élément par élément (ou terme à terme) sur les tableaux sont :
Opération mathématique scalaire
Instruction SCILAB
addition scalaire +
+
soustraction scalaire −
−
multiplication scalaire ×
.∗
division scalaire ÷
./
puissance scalaire ˆ
.^
Attention à ne
pas oublier
le . devant
l’opérateur !!
Si op désigne l’une des opérations terme à terme décrites ci-dessus, on retiendra que pour
effectuer A op B, il est nécessaire que les tableaux A et B soient de mêmes dimensions à moins que
l’un d’eux soit un scalaire (un tableau 1 × 1) auquel cas le scalaire est opéré (à l’aide de op) à tous
les éléments du tableaux.
Exercice 7.
Tapez à l’invite les expressions suivantes, suivies de la touche entrée :
--> M = [1, 0, 1; 0, 1, 0; 1, 0, 1], N = [1, 2, 3; 4, 5, 6; 7, 8, 9], P = [1; 2; 3]
--> M + N, M − N, M . ∗ N, M ./N, N .ˆ2
--> M + 1, M − 1, M . ∗ 3, M ./5
--> M . ∗ P
--> M ∗ P
Remarques :
• Lorsqu’on opère (élément par élément) deux tableaux de taille différentes, SCILAB n’est pas
d’accord et le fait savoir par un commentaire du type inconsistent operation.
• Ici, SCILAB refuse le calcule M . ∗ P (nous venons d’expliquer pourquoi) mais accepte le calcul
M ∗ P (nous verrons que l’opérateur ∗ sans le . correspond à la multiplication matricielle).
Il ne faut donc surtout pas oublier le . qui précède ∗, / ou ˆ si l’on veut effectuer une
multiplication, une division ou une élévation à la puissance TERME À TERME.
7
b)
Opérations fonctionnelles
Les fonctions usuelles que connait SCILAB offrent la particularité de s’appliquer aussi bien à
des éléments (en général des scalaires) qu’à des tableaux constitués de ces éléments.
Exercice 8.
Tapez à l’invite les expressions suivantes, suivies de la touche entrée :
--> M = [%pi/2, %pi; 0, 1],
--> sin(M), exp(M)
c)
Concaténation
La concaténation est l’opération qui permet de créer un nouveau tableau en assemblant (par
juxtaposition) plusieurs sous-tableaux de dimensions adéquates. Nous l’avons déjà rencontré dans
le cas des vecteurs.
Pour la syntaxe, on commence par déclarer chacun des sous-tableaux en les affectant à des
variables puis tout se passe comme si ces sous-tableaux étaient de simples scalaires (à condition
que les tailles des sous-tableaux soient compatibles pour la juxtaposition).
Exercice 9.
Tapez à l’invite les expressions suivantes, suivies de la touche entrée :
--> A = [0], B = [1, 1], C = [2; 2; 2], D = [3, 3; 3, 3; 3, 3]
--> M = [A, B; C, D]
Remarque :
• Schématiquement, on a réalisé l’opération suivante :
0
d)
1
ց
ւ
ր
տ
1
−−−−−−−−−−−−→
2
3
3
2
3
3
2
3
3
concaténation
0
1
1
2
3
3
2
3
3
2
3
3
Extraction
Lorsqu’on dispose d’une matrice, SCILAB offre la possibilité d’en extraire une sous-matrice.
Pour la syntaxe, on crée un tableau et on l’affecte à la variable A (par exemple), puis on utilise la
commande A([i1 , i2 , . . . , ip ], [j1 , j2 , . . . , jq ]) pour extraire la sous-matrice dont les coefficients
sont à l’intersection des lignes i1 , i2 , . . . , ip et des colonnes j1 , j2 , . . . , jq .
Exercice 10.
Tapez à l’invite les expressions suivantes, suivies de la touche entrée :
--> A = [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12]
--> Aext = A([1, 3], [2, 3, 4])
Remarque :
• La commande A([1, 3], [2, 3, 4]) extrait de la matrice A une matrice 2×3 dont les coefficients
sont à l’intersection des lignes 1, 3 et des colonnes 2, 3, 4.
8
B. 2.
Opérations matricielles
SCILAB a été spécifiquement conçu pour permettre la manipulation simple des matrices. Ainsi,
toutes les opérations usuelles (opérations arithmétiques matricielles, transposition, détermination
du rang, calcul de l’inverse, . . . ) sont évidemment disponibles (à condition que les formats des
matrices le permettent).
Toutefois, dans le cadre du programme de BCPST, il est recommandé de limiter l’usage des
opérations de l’algèbre linéaire à des cas très simples (et encore, à condition de savoir programmer
la fonction qui correspond). C’est l’une des exigences du jury ! Il peut paraître curieux de se priver
ainsi de l’une des caractéristiques principales de SCILAB mais l’objectif de ce cours n’est pas de
faire de vous des experts en SCILAB mais, bel et bien, de vous introduire les principes généraux
de l’informatique (généralisables à d’autres logiciels).
a)
Opérations arithmétiques
Les principales opérations matricielles sont :
Opération mathématique matricielle
Instruction SCILAB
addition matricielle +
+
soustraction matricielle −
−
multiplication matricielle ×
∗
puissance matricielle ˆ
^
Cette fois, il n’y
a pas de . devant
l’opérateur !!
L’addition et la soustraction matricielles n’ont pas à être (re)définies puisqu’elles coïncident
avec les opérations élément par élément correspondantes.
Pour effectuer A ∗ B, il est nécessaire que les matrices A et B soient compatibles pour ce calcul,
c’est-à-dire que le nombre de colonnes de A soit aussi le nombre de lignes de B.
La puissance matricielle ne s’applique qu’à des matrices carrées !!!
Exercice 11.
Tapez à l’invite les expressions suivantes, suivies de la touche entrée :
--> M = [−9, 7, 3; − 13, 10, 4; 4, − 3, − 1], N = [1, 0; 2, 0; 3, 1]
--> M ∗ N, Mˆ3, N ∗ M
Remarque :
• SCILAB refuse évidemment de faire le calcul N ∗ M (puisque les formats des matrices ne s’y
prètent pas) en indiquant une Multiplication incohérente.
b)
Transposition
En dehors des opérations arithmétiques introduites ci-dessus, c’est la seule autre opération
matricielle que nous introduirons.
Du point de vue syntaxique, la transposition d’une matrice réelle A s’effectue en postfixant une
apostrophe ’, c’est-à-dire en écrivant A’ (on notera la différence avec la notation mathématique
qui consiste à préfixer l’exposant t ).
Exercice 12.
Tapez à l’invite les expressions suivantes, suivies de la touche entrée :
--> P = [1, 2; 3, 4; 5, 6]
--> P’
9

Documents pareils