Was ist die effiziente und elegante Möglichkeit zum löschen von Elementen aus einer matrix in MATLAB?
Ich löschen möchte mehrere bestimmte Werte aus einer matrix (falls Sie existiert). Es ist sehr wahrscheinlich, dass es mehrere Kopien der Werte in der matrix.
Betrachten Sie zum Beispiel eine N-by-2 matrix intersections
. Wenn die Paare von Werten [a b]
und [c d]
existieren als Zeilen in der matrix, ich will um Sie zu löschen.
Sagen wir mal ich möchte die Zeilen löschen, wie [-2.0 0.5]
und [7 7]
in der folgenden matrix:
intersections =
-4.0000 0.5000
-2.0000 0.5000
2.0000 3.0000
4.0000 0.5000
-2.0000 0.5000
So, dass nach der Löschung habe ich erhalten:
intersections =
-4.0000 0.5000
2.0000 3.0000
4.0000 0.5000
Was ist die effizienteste/eleganter Weg, dies zu tun?
InformationsquelleAutor Kamran Bigdely | 2009-03-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, diese one-liner (wo Eine ist Ihr Schnittpunkt matrix und B ist der Wert zu entfernen):
Dann wiederholen Sie einfach die Letzte Zeile für jede neue B, die Sie entfernen möchten.
EDIT:
...und hier ist eine weitere option:
WARNUNG:, Die Antworten hier sind am besten für die Fälle eingesetzt, in denen kleine floating-point-Fehler sind nicht zu erwarten (d.h. mit ganzzahligen Werten). Wie bereits in diesem follow-up-Frage, mit dem "==" und "~=" die Betreiber können unerwünschte Folgen haben. In solchen Fällen, die oben genannten Optionen geändert werden sollte, um relationale Operatoren statt von Gleichheit von Operatoren. Zum Beispiel die zweite option, die ich Hinzugefügt geändert:
Nur eine kurze Kopf ist! =)
EINIGE RUDIMENTÄRE TIMING:
In den Fall, jemand war wirklich in der Effizienz interessiert, ich habe gerade einige einfache timing für drei verschiedene Möglichkeiten, um den subindex für die matrix (die beiden Optionen, die ich aufgelistet habe oben und Fanfan ist STRMATCH option):
Wie Sie sehen können, die STRMATCH option ist schneller als mein Erster Vorschlag, aber mein zweiter Vorschlag ist der Schnellste von allen drei. Beachten Sie jedoch, dass meine Möglichkeiten und Fanfan 's dazu leicht verschiedene Dinge: meine Optionen zurückzukehren logische Indizes der Zeilen halten, und Fanfan' s gibt die linearen Indizes der Zeilen entfernen. Das ist, warum die STRMATCH option verwendet die form:
während mir das Formular verwenden:
Aber, meine Indizes können negiert werden, verwenden Sie die erste form, die die Indizierung von Zeilen zu entfernen):
WoW...so elegante Art und Weise....
InformationsquelleAutor
Die einfache Lösung ist hier zu schauen, um set-Mitgliedschaft Funktionen, D. H., setdiff, union, ismember.
Sehen, was ismember mit den zwei arrays. Verwenden Sie die "Zeilen" - option.
Da wir möchten, löschen Sie die Zeilen von A sind auch in B, nur dazu:
Beachten Sie, dass set membership Funktionen suchen nach einer GENAUEN übereinstimmung. Ganzzahlen oder ein Vielfaches von 1/2, wie Sie in Einer Erfüllung dieser Anforderung. Sie sind genau so vertreten in Gleitkomma-Arithmetik in MATLAB.
Hatte diese zahlen wurden real floating-point-zahlen, ich hätte besser aufpassen sollen. Dort würde ich verwendet haben, eine Toleranz auf die Differenz. In diesem Fall, ich hätte geschätzt, die doppelseitig Distanz-matrix zwischen den beiden Gruppen von Nummern, entfernen einer Zeile einer nur, wenn er sich innerhalb einer bestimmten Entfernung von einer der Zeilen von B.
InformationsquelleAutor
Können Sie auch missbrauchen, strmatch-Funktion, um Ihre Bedürfnisse anzupassen: der folgende code entfernt alle vorkommen eines gegebenen Zeile b in einer matrix a
Wenn Sie löschen müssen, um mehr als eine Zeile, wie z.B. alle Zeilen von matrix B, Durchlaufen Sie diese:
InformationsquelleAutor
Nicht sicher, Wann diese Funktion eingeführt wurde (mithilfe 2012b), aber Sie können nur tun:
Basierend auf:
InformationsquelleAutor