Lycée Fénelon BCPST 1 Informatique Cours Les tableaux A. Définition des tableaux 3 A.1.Lestableauxmonodimensionnels: lesvecteurs..................... 3 a)définitiond unvecteur.............................. 3 b)consultationetmodificationdescoordonnéesd unvecteur......... 4 A.2.Lestableauxbidimensionnels: lesmatrices...................... 5 a)définitiond unematrice............................. 5 b)consultationetmodificationdescoefficientsd unematrice.......... 6 B. Opérations sur les tableaux 7 B.1.Opérationsélémentparélément............................. 7 a)opérationsarithmétiques............................ 7 b)opérationsfonctionnelles............................ 8 c)concaténation.................................. 8 d)extraction..................................... 8 B.2.Opérationsmatricielles.................................. 9 a)opérationsarithmétiques............................ 9 b)transposition................................... 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) lasyntaxedelastructurededonnéesdetypetableauetnousapprenonsàlamanipuler. 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,deschaînesdecaractèresavecdeschaînesdecaractères,... Dans cette structure de données, les éléments sont désignés par un numéro, que l on appelle indice. Cetindiceestunentiercomprisentre1etnoùndésignelenombred élémentsdutableau. 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 Ilexistedeuxtypesdetableauxàunedimension: lesvecteurslignesetlesvecteurscolonnes. 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émentsparunevirgule: [x 1, x 2,..., x n ]pouravoirunvecteurligneetparun point-virgule: [x 1 ; x 2 ;...; x n ]pourobtenirunvecteurcolonne. Définition d un vecteur ligne en compréhension: Si les éléments du tableau forment unesuitearithmétique,onutilisel instructiondébut:pas:fin(oudébut:fin)que nousavonsdé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(quivaut1pardéfaut)etfinestlavaleurànepasdé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)=x 1, u(2)=x 2,..., u(n)=x n, on fabriqueunvecteurcolonne,notéu,dontlesélémentssontx 1, x 2,..., x n. Définition par concaténation: Pour ajouter l élément x à un tableau u préexistant, on peutécrireu=[u, x]pourl ajouteràdroiteouu=[x, u]pourl ajouteràgauche. Exercice 1. --> 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] Lorsquedébut>fin,levecteur[début:fin]estletableauvide. Pourtransformerunvecteurligneuenunvecteurcolonneoul inverse,onécritu=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. Dansladéfinitionparconcaténation, il fautqueletableauexistedéjàavantdelui ajouter unélément: c estunedéfinitionparrécurrence. Siletableautabn existepas,ondoit,avant deluiajouterunélément,lecréerparinitialisationenposanttab=[]. 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 Sizozoestlenomd unevariabledetypevecteur(ligneoucolonne),lacommande 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),idésignelenumérodelacaseetzozo(i)l élémentcontenudanslai-èmecasedutableau zozo. Exercice 2. --> 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 Pour SCILAB, les vecteurs n ont pas de case numérotée 0. C est parfois un peu enquiquinant, parexemplepourreprésenterunesuitedontlepremiertermes appelleu 0. Ladernièrelignedecommandedel exercicemontrequel onpeutajouterunélémentàun vecteur ou même réaffecter l une de ses coordonnées. Exercice 3. Écrireunefonctionsommevect,dontlavariableestunvecteuru,quicalculelasommedes é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 vecteurligneestuntableau1 n,unvecteurcolonneestuntableaun 1,unechaînedecaractère estunvecteurdontlescoordonnéescorrespondentauxcodesasciidescaractèresdelachaî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,ilexisteplusieursméthodespourdéfinirunematricen m(c est-à-direàn lignesetmcolonnes): 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 [x 1,1, x 1,2, x 1,3, x 1,4 ; x 2,1, x 2,2, x 2,3, x 2,4 ; x 3,1, x 3,2, x 3,3, x 3,4 ] désigne la matrice x 1,1 x 1,2 x 1,3 x 1,4 x 2,1 x 2,2 x 2,3 x 2,4 x 3,1 x 3,2 x 3,3 x 3,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)=x 1,1, A(1,2)=x 1,2,..., A(n,m)=x n,m,onfabriquelamatricedontlescoefficientssontlesa i,j. Exercice 4. --> 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] 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 SiZOZOestunevariabledetypematricedetaillen m,lacommande size(zozo) stockedansunvecteurligneàdeuxcaseslenombredelignes(enpremièrecoordonnée)et le nombre de colonnes(en seconde coordonnée) de la matrice ZOZO. Ainsi, size(zozo, 1) est lenombredelignesetsize(zozo,2)estlenombredecolonnes. Deplus, 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ésignelai-èmeligne; ZOZO(:, j) désigne la j-ème colonne. Exercice 5. --> 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 rand(n,m) génère une matrice aléatoire de taille n m dont les coefficients sont choisis aléatoirement dans[0; 1]. Ladeuxièmelignedecommandemontrequel onpeutajouterunélémentàunematriceou 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émentsdea. 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 effectueraopb,ilestnécessairequelestableauxaetbsoientdemêmesdimensionsàmoinsque l und euxsoitunscalaire(untableau1 1)auquelcaslescalaireestopéré(àl aidedeop)àtous les éléments du tableaux. Exercice 7. --> 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 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,SCILABrefuselecalculeM. P(nousvenonsd expliquerpourquoi)maisacceptelecalcul 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. --> 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. --> 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 1 1 ց ւ 0 1 1 2 ր տ 3 3 concaténation 2 3 3 2 3 3 2 3 3 2 3 3 2 3 3 d) Extraction Lorsqu on dispose d une matrice, SCILAB offre la possibilité d en extraire une sous-matrice. Pourlasyntaxe,oncréeuntableauetonl affecteàlavariablea(parexemple),puisonutilisela commandea([i 1, i 2,..., i p ], [j 1, j 2,..., j q ])pourextrairelasous-matricedontlescoefficients sontàl intersectiondeslignesi 1, i 2,..., i p etdescolonnesj 1, j 2,..., j q. Exercice 10. --> A=[1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12] --> Aext=A([1, 3], [2, 3, 4]) Remarque : LacommandeA([1, 3],[2, 3, 4])extraitdelamatriceAunematrice2 3dontlescoefficients sontàl intersectiondeslignes1,3etdescolonnes2,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 lafonctionquicorrespond). C estl unedesexigencesdujury! Ilpeutparaîtrecurieuxdesepriver ainsi de l une des caractéristiques principales de SCILAB mais l objectif de ce cours n est pas de fairedevousdesexpertsenscilabmais,beletbien,devousintroduirelesprincipesgé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 ˆ ^ Cettefois,iln y apasde. 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. PoureffectuerA B,ilestnécessairequelesmatricesAetBsoientcompatiblespourcecalcul, c est-à-direquelenombredecolonnesdeasoitaussilenombredelignesdeb. La puissance matricielle ne s applique qu à des matrices carrées!!! Exercice 11. --> M=[ 9, 7, 3; 13, 10, 4; 4, 3, 1], N=[1, 0; 2, 0; 3, 1] --> M N, Mˆ3, N M Remarque : SCILABrefuseévidemmentdefairelecalculN M(puisquelesformatsdesmatricesnes 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 quiconsisteàpréfixerl exposant t ). Exercice 12. --> P=[1, 2; 3, 4; 5, 6] --> P 9