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