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!
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.
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.
La méthode inverse pour ce faire:
columns_you_want_to_keep = [1, 3, 5]
new_matrix = my_matrix(:,columns_you_want_to_keep)
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