Wenn Sie nur die Nullen entfernen möchten, die Nicht-Nullen hinter in eine Abgangs, dann ist die beste Lösung
a(a==0) = [];
Dies löscht die Null-Elemente, eine logische Indizierung Ansatz in MATLAB. Wenn der Index für einen Vektor ein boolescher Vektor ist, der dieselbe Länge wie der Vektor hat, kann MATLAB dieses boolesche Ergebnis verwenden, um es mit zu indizieren. So ist dies äquivalent zu
a(find(a==0)) = [];
Und, wenn Sie einige Array-Elemente auf [] in MATLAB gesetzt, die Konvention ist es, sie zu löschen.
Wenn Sie die Nullen in ein neues Ergebnis b setzen wollen, während eine unverändert bleiben, der beste Weg, wahrscheinlich
b = a(a ~= 0);
ist Wiederum ist logische Indizierung hier verwendet. Sie könnten die entsprechende Version (in Bezug auf das Ergebnis) von
b = a(find(a ~= 0));
aber mlint wird am Ende des Markieren Sie die Zeile als einen, wo der rein logische Index war effizienter und damit besser geeignet verwendet.
Wie immer, achten Sie auf EXACT-Tests für Null oder für eine beliebige Anzahl, wenn Sie Elemente einer akzeptiert hätten, die innerhalb einiger Epsilon Toleranz von Null waren. Haben diese Tests wie diese
b = a(abs(a) >= tol);
Diese behält nur die Elemente einer, die mindestens so groß wie Ihre Toleranz sind.
oder für das erste Beispiel, a = a (a ~ = 0) 'ist ausreichend, die In-Place-Zuweisung funktioniert gut. Guter Punkt beim Testen gegen eine kleine Zahl statt 0. – mtrw
@woodchips: Habe gerade einen Leistungsvergleich unten gepostet :) – tim