Gestion Des Matrices

Embed Size (px)

Citation preview

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