Se hai appena desidera rimuovere gli zeri, lasciando i non-zeri dietro in un, allora la soluzione migliore è
a(a==0) = [];
Questo elimina gli elementi a zero, utilizzando un approccio logico indicizzazione in MATLAB. Quando l'indice di un vettore è un vettore booleano della stessa lunghezza del vettore, MATLAB può usare quel risultato booleano per indicizzarlo con. Quindi questo è equivalente a
a(find(a==0)) = [];
E, quando si imposta alcuni elementi di un array a [] in MATLAB, la convenzione è quello di eliminarli.
Se si desidera inserire gli zeri in un nuovo risultato b, lasciando un invariato, il modo migliore è probabilmente
b = a(a ~= 0);
Anche in questo caso, l'indicizzazione logica è qui utilizzato. Si potrebbe avere utilizzato la versione equivalente (in termini di risultato) di
b = a(find(a ~= 0));
ma mlint finirà per contrassegnare la linea, come quella in cui l'indice puramente logico era più efficiente, e quindi più appropriato.
Come sempre, fare attenzione ai test ESATTI per zero o per qualsiasi numero, se si accettano elementi di un valore compreso in una tolleranza epsilonica pari a zero. Effettuate questi test
b = a(abs(a) >= tol);
Ciò mantiene solo quegli elementi di un valore almeno pari alla vostra tolleranza.
fonte
2010-04-14 09:22:29
o per il primo esempio, 'a = a (a ~ = 0)' è sufficiente, l'assegnazione sul posto funziona correttamente. Buon punto su test su un numero piccolo piuttosto che su 0. – mtrw
@woodchips: Ho appena postato un confronto delle prestazioni di seguito :) – tim