Comment sélectionner une sous-matrice (pas dans n'importe quel modèle) dans Matlab? Par exemple, pour une matrice de taille 10 sur 10, comment sélectionner la sous-matrice consistant en une intersection des 1ère et 2ème rangées et des 4ème et 6ème colonnes?
Merci pour toutes réponses utiles!
En ce qui concerne votre question, supposons que vous ayez une matrice arbitraire de 10 sur 10 A
. Le moyen le plus simple d’extraire la sous-matrice souhaitée serait avec un vecteur d’indice:
B = A([1 2 9], [4 6]);
Il y a un article intéressant dans la documentation officielle qui explique en détail l'indexation dans MATLAB. En gros, il y a plusieurs façons d'extraire un sous-ensemble de valeurs, je les résumerai pour vous:
Les vecteurs d'indexation indiquent les index de l'élément à extraire. Ils peuvent contenir un seul index ou plusieurs, comme ceci:
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 index de cette dimension.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.
L'indexation linéaire traite chaque matrice comme s'il s'agissait d'un vecteur de colonne en concaténant les colonnes en un vecteur de colonne 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 de colonne équivalent est:
A = [10;
40;
70;
20;
50;
80;
30;
60;
90]
et donc b
est égal à 40.
Les deux points spéciaux et les indices end
sont également autorisés. Pour cette raison, 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 d’indice est simplement convertie en un vecteur colonne et utilisée pour l’indexation linéaire. La matrice résultante a cependant toujours les mêmes dimensions que la matrice en indice.
Par exemple, si I = [1 3; 1 2]
, alors A(I)
est identique à l'écriture de reshape(A(I(:)), size(I))
.
Conversion des indices de matrice en indices linéaires et inversement: Pour cela, vous avez sub2ind
et ind2sub
, respectivement. Par exemple, si vous souhaitez convertir les indices [1, 3]
dans la matrice A
(correspondant à l'élément 30) en un index linéaire, vous pouvez écrire sub2ind(size(A), 1, 3)
(le résultat dans ce cas devrait être 7, bien sûr).
Dans l'indexation logique, les indices sont binaires, un 1
logique indique que l'élément correspondant est sélectionné et 0
signifie que ce n'est pas le cas. Le vecteur en indice doit avoir les mêmes dimensions que la matrice d'origine ou un vecteur avec 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 ceci:
Ir = logical([1 1 0]);
Ic = logical([1 0 1]);
B = A(Ir, Ic)
ou ca:
I = logical([1 0 1; 1 0 1; 0 0 0]);
B = A(I)
ou ca:
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 et doit être reconfiguré si nécessaire (par exemple, à l’aide de reshape
).
Laissez-moi vous expliquer avec un exemple:
Définissons une matrice 6x6
A = magic(6)
A =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
A partir de cette matrice, vous voulez que les éléments des rangées 1, 2 et 5 et des colonnes 4 et 6
B = A([1 2 5],[4 6])
B =
26 24
21 25
12 16
J'espère que cela t'aides.
function f = sub(A,i,j)
[m,n] = size(A);
row = 1:m;
col = 1:n;
x = row;
x(i) = [];
y=col;
y(j) = [];
f= A(x,y);
Renvoie la matrice A avec la i th ligne et la j th colonne supprimées.