Vous êtes sur la page 1sur 39

Gestion des matrices en matlab

Les matrices , vecteurs ,plus gnralement les tableaux

Sommaire N.B : ce plan est temporaire


Stockage des tableaux L'indexation linaire
Accder un lment d'un matrice en utilisant l'indexation linaire Passer d'une indexation l'autre
La fonction ind2sub La fonction sub2ind

La fonction reshape Suggestions: les matrices dans matlab

Iniciation :
De nombreux dveloppeurs, dbutants ou familiers avec les langages de bas niveau (C, Fortran, ...), utilisent MATLAB sans prendre le temps de bien comprendre les spcificits de ce langage. La comprhension de la gestion des matrices (tableaux 2D) par MATLAB est une tape essentielle dans la prise en main de ce langage. En effet, MATLAB est avant tout un logiciel de calcul matriciel et donc, matriser la manipulation des matrices, permet d'amliorer les performances des programmes par un codage propre et efficace. Comprendre la gestion des matrices permet galement de comprendre comment MATLAB gre les autres types de variables (tableaux multidimensionnels, structures et des tableaux de cellules) qui ne seront pas abords ici.

D'un point de vue mathmatique, une matrice est un tableau rectangulaire compos de m lignes et de n colonnes dont chaque lment correspond une valeur numrique. En informatique, on parle plus volontiers de tableaux. On parle mme de tableaux multidimensionnels (3D et plus). tant fortement li au monde des mathmatiques, sous MATLAB, ces deux terminologies coexistent. On parlera donc de matrices dans le cas de tableaux 2D. Note : il peut arriver que l'on parle abusivement de matrice 3D I-A. Matrice ou tableau ?

1-- cration des tableaux


Stockage des tableaux MatLab stocke les vecteurs, les matrices, et plus gnralement les tableaux, quelles que soient leurs dimensions, sous forme de vecteurs colonnes. Par exemple, la matrice suivante: T = t= [1 2 3 -8 ; 1 3 5 6 ; 1 5 5 6 ] 1 2 3 -8 1 3 5 6 1 5 5 6

Concatnation de tableaux []
La concatnation consiste coller des matrices bout bout afin d'obtenir une matrice supplmentaire. Cette opration s'effectue entre crochets. A l'intrieur de ces crochets, les diffrentes matrices doivent tre spares, soit par des points-virgules pour une concatnation verticale, soit par des virgules ou des espaces pour une concatnation horizontale. La concatnation verticale consiste mettre des matrices les unes sur les autres. Les diffrentes matrices doivent imprativement avoir le mme nombre de colonnes. Par exemple :, pour concatner verticalement les trois matrices suivantes :

A = [1 2 3] 1 2 3 B = ones(2,3) B= 1 1 1 1 1 1 C = [3 2 1] = 3 2 1 X = [A ; B ; C] = 1 2 3 1 1 1 1 1 1 3 2 1 Si les matrices n'ont pas le mme nombre de colonnes, MATLAB retourne un message d'erreur. Par exemple, si l'on tente de concatner verticalement ces trois matrices :

L'indexation linaire Cette manire de stocker sous MatLab, implique en particulier qu'on peut accder aux lments d'un tableau par un seul indice (variant de 1 au nombre total des lments du tableau), c'est ce qu'on appelle l'indexation linaire.

Accder un lment d'un tableau en utilisant l'indexation linaire :


Pour les matrices, nous venons de voir que le vecteur colonne qui leur correspondait tait simplement les colonnes de la matrice mises bout bout. Cependant, il est plus difficile de voir ce qui se passe lorsqu'on manipule des tableaux plus de 2 dimensions Considrons donc le cas particulier d'un tableau T trois dimensions, de taille 4x2x3. Ce tableau contient 24 lments. En les numrotant donc de 1 24 et en considrant (pour plus de clart) qu'un tableau 3 dimensions est un ensemble de pages (dernire dimension) contenant chacune des matrices (deux premires dimensions), voici comment ils sont organiss :

. Ces lments sont donc organiss dans le vecteur colonne qui correspond au tableau en incrmentant le premier indice du tableau, puis le second, puis le T=rand(4,2,3); troisime (et les suivants si on travaillait avec plus de 3 dimensions). Plus prcisment, voici comment on peut afficher les lments de T dans leur ordre de stockage. Tout d'abord, affectons une valeur T: T = rand (4,2,3);

Dans le vecteur colonne qui lui correspond, les lments sont donns dans leur ordre de stockage par : for p=1:3 for n=1:2 for m=1:4 disp(T(m,n,p)); end end end

Dit d'une autre manire, partant du vecteur colonne correspondant au stockage d'un tableau, celui-ci est "rang" dans le tableau en le dcoupant suivant la dernire dimension, puis la prcdente et ainsi de suite. Le dcoupage est donc fait de cette manire: Finalement, pour notre exemple, on peut accder au 11me lment du tableau T de deux manires: T (3,1,2) ou T (11)

Il suffit de taper les quelques lignes suivantes pour voir que les lments apparaissent dans le mme ordre qu'avec les 3 boucles imbriques prcdentes: for q = 1:24 Disp (T(q)); end

Suivant les cas, l'une ou l'autre des indexations peu tre plus pratique. Il existe des fonctions MatLab qui simplifient la manipulation de ces indexations: sub2ind permet de passer de l'indexation linaire l'indexation multiple. ind2sub permet de passer de l'indexation multiple l'indexation linaire. Une aide sur l'utilisation de ces fonctions est disponible depuis la fentre MatLab en tapant help sub2ind ou help ind2sub. Pour accder une aide plus dtaille, tapez doc sub2ind ou doc ind2sub. Plutt que d'expliquer l'utilisation de ces fonctions dans le cas gnral d'un tableau N dimensions, nous prendrons pour les explications un cas particulier.

La fonction ind2sub
Pour connatre l'indexation multiple correspondant aux indices 3, 8, 17, 23 d'un tableau de taille 4x2x3 il suffit de faire : V = [3;8;17;23]; [m n p] = ind2sub([4 2 3],v); Le premier argument de la fonction ind2sub est la taille du tableau pour laquelle on veut effectuer la conversion "indexation linaire indexation multiple" Le second argument v de la fonction ind2sub est le vecteur des indices qu'on veut convertir. Le membre de gauche [m n p] recevra les vecteurs correspondants l'indexation multiple.

Plus prcisment, pour tout tableau T de taille 4x2x3 nous aurons: T(m(1),n(1),p(1))=T(v(1))=T(3) T(m(2),n(2),p(2))=T(v(2))=T(8) T(m(3),n(3),p(3))=T(v(3))=T(17) T(m(4),n(4),p(4))=T(v(4))=T(23)

Vous pouvez alors tester ces quelques lignes:

T = rand(4,2,3); V = [3;8;17;23]; [m n p] = ind2sub([4 2 3],v); for q=1:4 disp([T(m(q),n(q),p(q)), T(v(q))]); end

La fonction sub2ind
pour voir que nous avons bien obtenu le rsultat escompt. Supposons qu'on veuille convertir en indexation linaire les multi-indices (2,2,1), (1,2,3), (4,1,2), (3,1,3) d'un tableau de taille 4x2x3, il suffit alors de faire: m = [2;1;4;3]; n = [2;2;1;1]; P = [1;3;2;3]; V = sub2ind([4 2 3],m,n,p); Le premier argument de la fonction sub2ind est la taille du tableau pour laquelle on veut effectuer la conversion "indexation multiple -> indexation linaire"

Les arguments suivants sont les colonnes m, n, p, contenant respectivement les indices de la premire dimension, les indices de la seconde dimension, les indices de la troisime dimension. Le membre de gauche v recevra le vecteur correspondant l'indexation linaire. Plus prcisment, pour tout tableau T de taille 4x2x3 nous aurons: T(v(1))=T(m(1),n(1),p(1))=T(2,1,1) T(v(2))=T(m(2),n(2),p(2))=T(1,2,3) T(v(3))=T(m(3),n(3),p(3))=T(4,1,2) T(v(4))=T(m(4),n(4),p(4))=T(3,1,3)

Vous pouvez alors tester ces quelques lignes: T = rand(4,2,3); m = [2;1;4;3]; n = [2;2;1;1]; P = [1;3;2;3]; V = sub2ind([4 2 3],m,n,p); for q=1:4 disp([T(v(q)), T(m(q),n(q),p(q))]); end pour voir que nous avons bien obtenu le rsultat escompt.

La fonction reshape
Prenant en considration le stockage d'un tableau sous MatLab, on comprend aisment que la taille d'un tableau n'est pas importante et qu'il suffit d'une petite fonction pour donner un tableau la forme qu'on veut (pourvu que le nombre d'lments ne change pas). La fonction MatLab qui permet de redimensionner un tableau est reshape. Comme pour les autres fonctions, une aide concernant cette fonction est accessible depuis la fentre MatLab en tapant help reshape ou bien doc reshape pour une aide encore plus dtaille. Pour comprendre l'action de l'instruction reshape, il suffit de savoir qu'en redimensionnant un tableau T en un tableau M, les lments de T sont pris dans l'ordre croissant de leur indexation linaire et sont "placs" dans M avec le mme ordre. Prenons de nouveau l'exemple du tableau T prcdent (T est de taille 4x2x3). Comme il a dj t dit, le nombre d'lments de ce tableau est 24. On voit que c'est aussi le nombre d'lments d'une matrice M de taille 6x4. Voici ce qui se passe donc lorsqu'on tape le code suivant: M = reshape (T,[6 4]);

On remarquera qu'on peut facilement obtenir le tableau initial M l'aide de M en le redimensionnant comme il le faut:

TT = reshape (M,[4 2 3]); Le tableau TT est alors identique au tableau M initial.

Sous-tableaux et blocs
Soient M un tableau ,L une liste dentiers compris entre 1 et le nombre de lignes de M ,et K une liste dentiers compris entre 1 et le nombre de colonnes de M . Alors M(L,k) est sous tableau de M form par les lments de M dont lindice de ligne appartient l et lindice de colonne appartient k .M (l,k) est un bloc lorsque les listes L et k sont constitues dentiers successifs . Exemple : M= [1 2 3 5 6; 8 4 5 5 9; -8 10 12 5 6] L= [1 2 ]; k=[1 3 5] M1=M(L,k)

Diagonaux dun tableau diag


On suppose M un tableau ,diag(M) retourne le vecteur diagonal de M form des lment de la diagonale principale de M , cest die les lments de la forme M(n,n)d o p est un entire compris entre 1 et min(zise(M,1),size(M,2)). Plus gnralement pour K entier compris entre size(M,1)et size(M,2) , on appelle diagonale de range K lensemble des lments de M de la forme M(p,p+k) avec K et P entiers tel que : 1<=k<=size(M,2)et 1<=P<=min(size(M,1),size(M,2)-K) (surdiagonale de rang K ). K= 0 et 1<=P<=min(size(M,1),size(M,2)) (diagonale principale ) . -size(M,1)<=K<=-1 et 1-K<=p<=min(size(M,1),size(M,2)-K) ( sous diagonale de rang k ) . La fonction diag(M,k) retourne le vecteur form des lments de la diagonale de rnag K de M .

Exemple :
M= v = diag(M,1) %sur 12345 diagonale de rang 1 25896 v = dpend des donnes 7 4 12 11 que tu as saisir. V =diag(M)% diagonale principale V = mme chose . V= diag(M,2)%sous diagonale de rang 2 N.b : chacun opration doit tre spar a lautre

Fonctions tril et triu


Les fonctions tril et triu extraient respectivement les termes situs sur et au dessous de la diagonale de rang K et les termes situs sur et au-dessous de la diagonale de rang K . Exemple : avec le meme tableau que dans lexemple ci-dessus : Tril=(M,1) et triu(M,1)

Fonction Diag(m)

Argument Un vecteur ou une liste

Rsultat Matrice diagonale dont la diagonale est la liste ou le vecteur Matrice identit dordre n Sous matrice (n,m) de i max (n,m) (1)

Eye(n) Eye (n,m)

Un entier m Deux entiers n et m

Magic(n) Pascal(n) Rand(n)

Un entier n Un entier n Un Entier n

Zeros(n)ou zeros(n,m)

Un entier n ou deux entiers n et m

Carr magique dordre n Matrice de pascal dordre n Matrice alatoire carr dordre n Matrice nulle dordre n ou de format (n,m) (1)

Fonction statistiques :mean et cov


On peut applique une liste ou un vecteur , la fonction MEAN dtermine la moyenne des lment de la liste ou du valeur . De meme on peut appliqu LA FONCTION MEAN retourne la liste des moyennes des lments de chaque colonne . La fonction COV dtermine la variance des lment de la liste ou du vecteur . Applique un tableau o chaque ligne reprsente une observation et o chaque colonne correspond une variable ,la fonction COV retourne la matrice de covariance des lment du tableau .

Fonction abs :
Cette fonction est appliqu un tableau retourne un tableau de meme format dont les lments sont les valeurs absolues des lments du tableau argument .

IV-B. Rplication

IV-B-1. Rplication entire La mthode la plus simple pour rpliquer une matrice consiste employer la fonction repmat : >> A=[1 2 3 ; 4 5 6]A = 1 2 3 4 5 6 X=repmat(A,3,2) = 1 2 3 1 2 3 4 5 6 4 5 6 1 2 3 1 2 3 4 5 6 4 5 6 1 2 3 1 2 3 4 5 6 4 5 6 L'autre solution consiste rpter les indices lors de l'indexage : AA = 1 2 3 4 5 6 >> X=A([1 2 1 2 1 2],[1 2 3 1 2 3]) X= 1 2 3 1 2 3 4 5 6 4 5 6 1 2 3 1 2 3 4 5 6 4 5 6 1 2 3 1 2 3 4 5 6 4 5 6

Quelques application
Id3 = eye(3) Id3 = 100 010 001 Un= ones (2) Un = 11 11 Z= zeros(2,3) Z= 000 000 (matrice identit d'ordre 3)

(matrice constitue de 1 d'ordre 2)

(matrice nulle d'ordre 2x3)

A1(:,1) (colonne 1 de la matrice A1) ans = 11 21 31 A1 (2,:) (ligne 2 de la matrice A1) ans = 21 22 23 Les erreurs de dimensions des objets matriciels sont une des principales difficults que rencontre le dbutant. Pour vrifier ces tailles, on pourra utiliser la commande size : size(A1)

Les erreurs de dimensions des objets matriciels sont une des principales difficults que rencontre le dbutant. Pour vrifier ces tailles, on pourra utiliser la commande size : Size (A1) ans = 33 Size (u) ans = 31

Ut = u' (transposition d'un vecteur ligne ou colonne) ut = 1 2 3

Ut2 = [ut ut] ut2 = 11 22 33 Ut3 = [ut; ut] ut3 = 1 2 3 1 2 3 Ps = v*ut ps = 4 M=ut*v M= -1 1 1 -2 2 2 -3 3 3 L = M+2* eye (3) L= 111 -2 4 2 -3 3 5

(Concatnation en ligne de deux vecteurs colonnes qui donne une matrice 3x2)

(Concatnation en colonne de deux vecteurs colonnes qui donne un vecteur 6x1)

(Produit qui conduit au produit scalaire)

(Produit qui conduit une matrice)

Rsumer
Pour rsumer :

les scalaires, les vecteurs et les matrices sont tous considrs comme des matrices dans l'espace de travail de MATLAB les matrices sont stockes en mmoire sous forme de vecteurs colonne par colonne trois mthodes d'indexage sont utilisables : classique, linaire et logique MATLAB possde des fonctions toutes faites pour la concatnation, la rplication ou le redimensionnement des matrices Certaines parties de cet article, comme celle relative au stockage des matrices en mmoire, sont volontairement simplifies. En effet, le but de cet article est avant tout de bien faire comprendre aux dveloppeurs que MATLAB est un langage matriciel. Il faut donc, gnralement, pour obtenir du code efficace, manipuler les matrices dans leur ensemble et non pas lment par lment. C'est ce que l'on appelle la vectorisation