web-dev-qa-db-fra.com

Comment sélectionner une sous-matrice (pas dans un motif particulier) dans Matlab

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!

17
v32

TLDR: réponse courte

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]);


Indexation dans MATLAB

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:

1. Vecteurs d'indexation

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.
  • Les deux points sont juste 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 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).

3. Indexation logique

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

40
Eitan T

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.

13
R. Schifini
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. 

0
Cameron