web-dev-qa-db-fra.com

Supprimer une colonne d'une matrice dans GNU Octave

Dans GNU Octave, je veux pouvoir supprimer des colonnes spécifiques d'une matrice. Dans l'intérêt de la généralité. Je veux aussi pouvoir supprimer des lignes spécifiques d'une matrice.

Supposons que j'ai ceci:

mymatrix = eye(5)

mymatrix =

Diagonal Matrix

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

Je souhaite supprimer les colonnes 2 et 4, mais lorsque je supprime la colonne 2, la position de la colonne 4 est passée à la colonne 3, ce qui me fait mal à la tête. Il doit y avoir une meilleure façon!

47
Eric Leschinski

GNU Octave supprime les colonnes 2 et 4 d'une matrice

mymatrix = eye(5); 
mymatrix(:,[2,4]) = []; 
disp(mymatrix)

Tirages:

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

GNU Octave supprime les lignes 2 et 4 d'une matrice:

mymatrix = eye(5); 
mymatrix([2,4],:) = [];
disp(mymatrix) 

Tirages:

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

complexité temporelle

La complexité du processeur de GNU Octave pour le découpage et la diffusion est ici un temps linéaire rapide O(n * c) où n est le nombre de lignes et c un nombre constant de lignes qui restent. Il est monocœur de niveau C vectorisé mais pas parallèle.

complexité de la mémoire

La complexité de la mémoire de travail est linéaire: O(n * 2) C crée un clone des deux objets, itère sur chaque élément, puis supprime l'original.

Le seul moment où la vitesse sera un problème est si vos matrices sont irréalistes, larges ou hautes, ou ont un certain nombre de dimensions qui soufflent votre mémoire rapide, et la vitesse est limitée par la vitesse de transfert entre le disque et la mémoire.

56
HerrKaputt

Si vous ne connaissez pas le nombre exact de colonnes ou de lignes, vous pouvez utiliser l'index magique "end", par exemple:

mymatrix(:,2:end)  % all but first column

mymatrix(2:end,:)  % all but first row

Cela vous permet également de découper des lignes ou des colonnes d'une matrice sans avoir à la réaffecter à une nouvelle variable.

63
pors

La méthode inverse pour ce faire:

columns_you_want_to_keep = [1, 3, 5]
new_matrix = my_matrix(:,columns_you_want_to_keep)
12
thethakuri

Comment supprimer plusieurs colonnes en octave:

Comment supprimer les colonnes 2 et 4:

columns_to_remove = [2 4];
matrix(:,columns_to_remove)=[]

Illustré:

mymatrix = eye(5)
mymatrix =

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



columns_to_remove = [2 4];

mymatrix(:,columns_to_remove)=[]


mymatrix =

   1   0   0
   0   0   0
   0   1   0
   0   0   0
   0   0   1 
8
Eric Leschinski