Articles techniques

La perspective de MathWorks

Indexation des matrices dans MATLAB


Auteurs:

  • Steve Eddins, MathWorks
  • Loren Shure, MathWorks

8 minutes de lecture

Résumé

  • L'indexation matricielle permet de sélectionner et de modifier efficacement les données : elle est au coeur de la manipulation des tableaux et des algorithmes basés sur les matrices.
  • MATLAB supporte plusieurs styles d'indexation, notamment l'indexation par indices et l'indexation par vecteurs, ainsi que l'opérateur « : » et le mot-clé « end » qui permettent d'accéder à des plages et aux éléments limites.
  • L'indexation supporte à la fois l'extraction et l'affectation, ce qui permet d'effectuer des transformations concises telles que réordonnancer les éléments, remplacer des valeurs et appliquer des opérations sur des sous-tableaux.
  • Une indexation efficace constitue la base de la vectorisation, permettant ainsi de réduire le recours aux boucles et de produire un code généralement plus court, plus clair et plus rapide.

L'indexation matricielle permet de sélectionner ou de modifier un sous-ensemble d'éléments de la matrice. MATLAB® propose plusieurs styles d'indexation qui sont non seulement puissants et flexibles, mais aussi lisibles et explicites. Les matrices constituent un élément central de MATLAB pour l'organisation et l'analyse des données, et l'indexation est essentielle pour manipuler efficacement les matrices de manière compréhensible.

L'indexation est étroitement liée à un autre terme que les utilisateurs de MATLAB rencontrent souvent : la vectorisation. La vectorisation consiste à utiliser les opérations matricielles et vectorielles de MATLAB à la place des opérations scalaires. Elle permet généralement d'obtenir un code plus court, plus proche de l'expression mathématique, plus lisible et parfois plus rapide.

Indexation de vecteurs

Commençons par le cas simple d'un vecteur avec des indices.

 v = [16 5 9 4 2 11 7 14];

L'indice peut être une valeur unique :

 v(3) % Extract the third element
 ans =
 9

Mais un indice peut lui-même être constitué d'un autre vecteur.

 v([1 5 6]) % Extract the first, fifth, and sixth elements
 ans =
 16 2 11

La notation « : » de MATLAB permet d'extraire facilement une plage d'éléments de v.

 v(3:7) % Extract the third through the seventh elements
 ans =
 9 4 2 11 7

Vous pouvez intervertir les deux moitiés de v pour obtenir un nouveau vecteur.

 v2 = v([5:8 1:4]) % Extract and swap the halves of v
 v2 =
 2 11 7 14 16 5 9 4

L'opérateur spécial end est un raccourci simple désignant le dernier élément de v.

 v(end) % Extract the last element
 ans =
 14

L'opérateur end peut être utilisé dans une plage.

 v(5:end) % Extract the fifth through the last elements
 ans =
 2 11 7 14

Vous pouvez même effectuer des opérations arithmétiques avec end.

 v(2:end-1) % Extract the second through the next-to-last elements
 ans =
 5 9 4 2 11 7

Combinez l'opérateur « : » et end pour obtenir divers effets, par exemple extraire chaque k-ième élément ou inverser le vecteur dans sa globalité.

 v(1:2:end) % Extract all the odd elements
 ans =
 16 9 2 7
 v(end:-1:1) % Reverse the order of elements
 ans =
 14 7 11 2 4 9 5 16

En utilisant une expression d'indexation à gauche du signe égal, vous pouvez remplacer certains éléments du vecteur.

 v([2 3 4]) = [10 15 20] % Replace some elements of v
 v =
 16 10 15 20 2 11 7 14

En règle générale, le nombre d'éléments à droite doit être identique au nombre d'éléments désignés dans l'expression d'indexation à gauche. Vous pouvez toutefois toujours utiliser un scalaire à droite. C'est ce que l'on appelle l'expansion scalaire.

 v([2 3]) = 30 % Replace second and third elements by 30
 v =
 16 30 30 20 2 11 7 14

Rappel : MATLAB utilise une indexation à base 1. Pour indexer les éléments de matrices, certains langages comptent à partir de zéro. D'autres langages, comme MATLAB, démarrent à 1. MATLAB utilise la même notation que celle que vous retrouverez probablement dans les manuels de mathématiques. Pourquoi MATLAB a-t-il choisi de commencer à 1 ? Selon Cleve Moler, fondateur de MATLAB, « c'est ainsi que fonctionnent les mathématiques ».

Matrices indexées avec deux indices

Penchons-nous maintenant sur l'indexation des éléments de matrices. Nous allons utiliser dans nos exemples un carré magique.

 A = magic(4)
 A =
 16 2 3 13
 5 11 10 8
 9 7 6 12
 4 14 15 1

Le plus souvent, l'indexation dans les matrices utilise deux indices : le premier pour les lignes et le second pour les colonnes.

La forme la plus simple permet de sélectionner un seul élément.

 A(2,4) % Extract the element in row 2, column 4
 ans =
 8

De manière plus générale, les deux indices peuvent, individuellement ou conjointement, être des vecteurs.

 A(2:4,1:2)
 ans =
 5 11
 9 7
 4 14

Un seul « : » utilisé en guise d'indice correspond à la notation abrégée de « 1:end », souvent employée pour sélectionner des lignes ou des colonnes entières.

 A(3,:) % Extract third row
 ans =
 9 7 6 12
 A(:,end) % Extract last column
 ans =
 13
 8
 12
 1

Il y a parfois une certaine confusion quant à la manière de sélectionner des éléments dispersés dans une matrice. Supposons par exemple que vous souhaitiez extraire les éléments (2,1), (3,2) et (4,4) de A.

Matrice 4x4 comportant trois valeurs mises en évidence, dispersées dans différents emplacements de la matrice. Ils se trouvent respectivement à la ligne 2, colonne 1 ; à la ligne 3, colonne 2 ; et à la ligne 4, colonne 4.

Éléments dispersés dans une matrice.
Comment pourrions-nous noter ce résultat souhaité ?

L'expression A([2 3 4], [1 2 4]) ne donnera pas le résultat souhaité. Ce schéma illustre le fonctionnement de l'indexation à deux indices.

L'extraction d'éléments dispersés dans une matrice nécessite un autre type d'indexation, ce qui nous amène à notre sujet suivant.

Indexation linéaire

Que représente l'expression A(14) ?

Si vous utilisez un seul indice avec la matrice A, MATLAB traite A comme si ses éléments étaient enchaînés dans un long vecteur colonne, en parcourant les colonnes les unes après les autres comme suit :

16
5
9
...
8
12
1

Conseil : MATLAB utilise un ordre de parcours par colonnes. Par conséquent, l'indexation linéaire commence par la première colonne et progresse vers le bas avant de passer à la colonne suivante.

L'expression A(14) extrait simplement le 14e élément du vecteur colonne implicite. Cette méthode d'indexation des matrices avec un indice unique est souvent appelée indexation linéaire.

D'après le schéma, qui matérialise les indices linéaires dans le coin supérieur gauche de chaque élément de la matrice, vous pouvez constater que A(14) est identique à A(2,4).

L'indice unique peut lui-même être un vecteur contenant plusieurs indices linéaires, comme dans l'exemple suivant :

 A([6 12 15])
 ans =
 11 15 12

Revenons au problème consistant à extraire uniquement les éléments (2,1), (3,2) et (4,4) de la matrice A. Pour y parvenir, vous pouvez employer l'indexation linéaire.

 A([2 7 16])
 ans =
 5 7 1

Les choses sont plutôt faciles à comprendre dans cet exemple, mais comment calcule-t-on les indices linéaires de manière générale ? MATLAB propose une fonction appelée sub2ind qui convertit les indices de ligne et de colonne en indices linéaires. Vous pouvez l'utiliser pour extraire les éléments souhaités comme suit :

 idx = sub2ind(size(A), [2 3 4], [1 2 4])
 ans =
 2 7 16
 A(idx)
 ans =
 5 7 1

Indexation logique

Une autre variante d'indexation, dite indexation logique, constitue une notation concise et explicite qui s'avère utile dans de nombreuses applications, notamment le traitement d'images. Dans l'indexation logique, vous utilisez un unique tableau logique comme indice de la matrice.

Voici un exemple de tableau logique que vous pourriez utiliser :

A > 12 

ans =
4×4 logical array

1  0  0  1
0  0  0  0
0  0  0  0
0  1  1  0

Il s'agit des éléments de la matrice pour lesquels l'expression logique est vraie : en l'occurrence, toutes les cases dont la valeur est supérieure à 12.

L'expression A(A > 12) permet d'extraire les éléments de la matrice correspondant aux valeurs non nulles du tableau logique. Le résultat se présente toujours sous la forme d'un vecteur colonne.

A(A > 12) 

ans =

 16
 14
 15
 13

De nombreuses fonctions MATLAB dont le nom commence par is renvoient des tableaux logiques et s'avèrent très utiles pour l'indexation logique. Par exemple, vous pouvez remplacer tous les éléments NaN d'un tableau par une autre valeur en combinant la fonction isnan, l'indexation logique et l'expansion scalaire, le tout en une seule ligne de code.

 B(isnan(B)) = 0

MATLAB propose de nombreuses fonctions pour les tableaux de chaînes de caractères qui renvoient des tableaux logiques, telles que contains, startsWith et matches. Vous pouvez les utiliser pour effectuer des opérations sur du texte en utilisant l'indexation logique. Par exemple, vous pouvez extraire tous les noms de programmes spatiaux contenant « Skylab ».

>> names

names =

  6×1 string array

    "Mercury"
    "Gemini"
    "Apollo"
    "Skylab"
    "Skylab B"
    "ISS"

>> names(contains(names,"Skylab"))

ans =

  2×1 string array

    "Skylab"
    "Skylab B"

L'indexation logique est étroitement liée à la fonction find. L'expression A(A > 5) est équivalente à A(find(A > 5)). L'expression utilisant l'indexation logique est plus rapide dans les cas simples, mais vous pouvez utiliser find si vous avez besoin des valeurs des indices pour une autre opération du calcul. Par exemple, supposons que vous souhaitiez remplacer temporairement les valeurs NaN par des zéros, effectuer quelques calculs, puis restaurer les valeurs NaN à leur emplacement d'origine. Dans cet exemple, le calcul consiste en un filtrage bidimensionnel effectué avec filter2. Voici comment procéder :

 nan_locations = find(isnan(A)); 

 A(nan_locations) = 0; 

 A = filter2(ones(3,3), A); 

 A(nan_locations) = NaN; 

Nous espérons que les exemples présentés dans cet article vous donnent une idée des différentes façons de formuler des algorithmes de manière concise et efficace. Intégrer ces techniques et les fonctions associées à votre répertoire de programmation MATLAB vous permet de renforcer votre capacité à créer du code concis, lisible et vectorisé.

Publié en 2024


Produits utilisés : MATLAB

Continuer votre exploration