TLDR : Réponse courte
Pour répondre à votre question, supposons que vous disposiez d'une matrice arbitraire de 10 par 10 A
. La manière la plus simple d'extraire la sous-matrice souhaitée est d'utiliser un vecteur d'index :
B = A([1 2 9], [4 6]);
L'indexation dans MATLAB
Il y a un article intéressant dans la documentation officielle qui explique en détail l'indexation dans MATLAB. En fait, il existe plusieurs façons d'extraire un sous-ensemble de valeurs, que je vais résumer pour vous :
1. Indexation des vecteurs
Les vecteurs d'indexation indiquent les indices de l'élément à extraire. Ils peuvent contenir un seul indice ou plusieurs, comme suit :
A = [10 20 30 40 50 60 70 80 90]
%# Extracts the third and the ninth element
B = A([3 9]) %# B = [30 90]
Les vecteurs d'indexation peuvent être spécifiés pour chaque dimension séparément, par exemple :
A = [10 20 30; 40 50 60; 70 80 90];
%# Extract the first and third rows, and the first and second columns
B = A([1 3], [1 2]) %# B = [10 30; 40 60]
Il existe également deux indices spéciaux : end
et les deux points ( :
) :
-
end
indique simplement le dernier indice de cette dimension.
- Les deux points ne sont qu'une notation abrégée pour "1:end".
Par exemple, au lieu d'écrire A([1 2 3], [2 3])
vous pouvez écrire A(:, 2:end)
. Ceci est particulièrement utile pour les grandes matrices.
2. Indexation linéaire
L'indexation linéaire traite toute matrice comme s'il s'agissait d'un vecteur de colonnes en concaténant les colonnes en un vecteur de colonnes et en attribuant des indices aux éléments respectivement. Par exemple, nous avons :
A = [10 20 30; 40 50 60; 70 80 90];
et nous voulons calculer b = A(2)
. Le vecteur colonne équivalent est :
A = [10;
40;
70;
20;
50;
80;
30;
60;
90]
et donc b
équivaut à 40.
Les deux points spéciaux et end
Les indices sont également autorisés, bien entendu. C'est la raison pour laquelle, A(:)
convertit n'importe quelle matrice A
en un vecteur colonne.
Indexation linéaire avec indices de matrice : Il est également possible d'utiliser une autre matrice pour l'indexation linéaire. La matrice en indice est simplement convertie en vecteur colonne et utilisée pour l'indexation linéaire. La matrice résultante est cependant toujours de la même dimension que la matrice en indice.
Par exemple, si I = [1 3; 1 2]
entonces A(I)
revient à écrire reshape(A(I(:)), size(I))
.
Conversion des indices matriciels en indices linéaires et vice versa : Pour cela, vous avez sub2ind
y ind2sub
respectivement. Par exemple, si vous souhaitez convertir les indices [1, 3]
dans la matrice A
(correspondant à l'élément 30) en un indice linéaire, on peut écrire sub2ind(size(A), 1, 3)
(le résultat dans ce cas devrait être 7, bien sûr).
3. Indexation logique
Dans l'indexation logique, les indices sont binaires. 1
indique que l'élément correspondant est sélectionné, et 0
signifie qu'il ne l'est pas. Le vecteur en indice doit être soit de la même dimension que la matrice originale, soit un vecteur ayant le même nombre d'éléments. Par exemple, si nous avons :
A = [10 20 30; 40 50 60; 70 80 90];
et nous voulons extraire A([1 3], [1 2])
en utilisant l'indexation logique, nous pouvons faire l'un ou l'autre :
Ir = logical([1 1 0]);
Ic = logical([1 0 1]);
B = A(Ir, Ic)
ou ceci :
I = logical([1 0 1; 1 0 1; 0 0 0]);
B = A(I)
ou ceci :
I = logical([1 1 0 0 0 0 1 1 0]);
B = A(I)
Notez que dans les deux derniers cas, il s'agit d'un vecteur unidimensionnel, qui doit être reformé en matrice si nécessaire (par exemple, à l'aide de la fonction reshape
).