# Remove repeated numbers in series

1 view (last 30 days)
Eric on 7 Apr 2019
Edited: madhan ravi on 12 Apr 2019
Hi everyone,
I have a sequence of number like
x = [3 3 3 3 3 2 2 2 2 2 2 2 1 1 1 1 3 3 3 3 3 3];
And I would like to reduce it to be:
x = [3 2 1 3];
Does anyone know how to do that?
Thanks a lot,
Eric

Star Strider on 7 Apr 2019
Try this:
x = [3 3 3 3 3 2 2 2 2 2 2 2 1 1 1 1 3 3 3 3 3 3];
dx = diff([0 x]);
fx = find(dx ~= 0);
Result = x(fx)
producing:
Result =
3 2 1 3
Note: This works here, and may not scale up to other problems.
Stephen23 on 8 Apr 2019
Edited: Stephen23 on 8 Apr 2019
Note that this code will not work if the first value happens to be zero. This bug is easy to fix by prepending a logical value after diff (rather than prepending a fake data value before diff). It is also easy get rid of the superfluous find as well:
>> x = [0 0 0 3 3 3 3 3 2 2 2 2 2 2 2 1 1 1 1 3 3 3 3 3 3];
>> y = x([true,diff(x)~=0])
y =
0 3 2 1 3
Star Strider on 12 Apr 2019
@Stephen —
Noted. Thank you.

madhan ravi on 8 Apr 2019
Edited: madhan ravi on 12 Apr 2019
Try this:
ii = [find(x(1:end-1) ~= x(2:end)) numel(x)];
l = diff([0 ii]); % just as a bonus but can be neglected if your not interested how many times the number appears consecutively
u = x(ii)
Stephen23 on 8 Apr 2019
What is l used for?
madhan ravi on 8 Apr 2019
Ah , it’s not needed but it gives the number of consecutive times the number appears in a sequence.