17 votes

Comment sélectionner une sous-matrice (pas selon un modèle particulier) dans Matlab ?

Comment sélectionner une sous-matrice (sans motif) dans Matlab ? Par exemple, pour une matrice de taille 10 par 10, comment sélectionner la sous-matrice constituée de l'intersection des 1ère, 2ème et 9ème lignes et des 4ème et 6ème colonnes ?

Merci pour toute réponse utile !

42voto

Eitan T Points 24450

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 ).

13voto

R. Schifini Points 6223

Je m'explique à l'aide d'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

Dans cette matrice, vous voulez les éléments des lignes 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 vous aidera.

0voto

Cameron Points 1
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);

Retourne la matrice A, avec les i th et j th colonne supprimée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X