How can I efficiently remove zeroes from a (non-sparse) matrix?

Barry S picture Barry S · Apr 10, 2009 · Viewed 63.4k times · Source

I have a matrix:

x = [0 0 0 1 1 0 5 0 7 0];

I need to remove all of the zeroes, like so:

x = [1 1 5 7];

The matrices I am using are large (1x15000) and I need to do this multiple times (5000+), so efficiency is key!

Answer

gnovice picture gnovice · Apr 10, 2009

One way:

x(x == 0) = [];

A note on timing:

As mentioned by woodchips, this method seems slow compared to the one used by KitsuneYMG. This has also been noted by Loren in one of her MathWorks blog posts. Since you mentioned having to do this thousands of times, you may notice a difference, in which case I would try x = x(x~=0); first.

WARNING: Beware if you are using non-integer numbers. If, for example, you have a very small number that you would like to consider close enough to zero so that it will be removed, the above code won't remove it. Only exact zeroes are removed. The following will help you also remove numbers "close enough" to zero:

tolerance = 0.0001;  % Choose a threshold for "close enough to zero"
x(abs(x) <= tolerance) = [];