How to filter an array?

12 visualizaciones (últimos 30 días)
Meshooo
Meshooo el 6 de En. de 2016
Comentada: Guillaume el 7 de En. de 2016
Dear all,
I have this array
A = [0;0;0;0;0;0;1;1;1;0;0;0;0;0;0;1;0;0;0;0];
I want only one representative for each group of ones. So how to make
A = [0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;1;0;0;0;0];
Any help will be appreciated.
Best, Meshoo
  3 comentarios
Stephen23
Stephen23 el 6 de En. de 2016
And what if there are an even number of ones?
A = [0;1;1;0]
what output do you want?
Meshooo
Meshooo el 6 de En. de 2016
I don't care which right or left to take in case of even number of ones.
A = [0;0;1;0]
or
A = [0;1;0;0]
Any answer is OK.

Iniciar sesión para comentar.

Respuesta aceptada

Guillaume
Guillaume el 6 de En. de 2016
It's very simple:
diff([0; A]) == 1
simply detects all transition from 0 to 1 and return them as 1.
  1 comentario
Guillaume
Guillaume el 7 de En. de 2016
Note that this keeps just the first 1 of a block as opposed to the middle 1 of a block, which the other solutions do.

Iniciar sesión para comentar.

Más respuestas (3)

goerk
goerk el 6 de En. de 2016
A = [0;0;0;0;0;0;1;1;1;0;0;0;0;0;0;1;0;0;0;0];
% A = [0;1;1;0;1;1;1];
dA = diff(A);
ind = 1:length(A);
startInds = ind(dA>0)+1;
endInds = ind(dA<0);
if length(endInds)<length(startInds) %last value is 1
endInds(end+1) = length(A);
end
midInd = floor((startInds+endInds)/2); % when even choose left
% midInd = ceil((startInds+endInds)/2); % when even choose right
B = zeros(size(A));
B(midInd) = 1;
[A B] % show result, to check input and output
  2 comentarios
Guillaume
Guillaume el 6 de En. de 2016
Your answer will fail if the first element of A is 1. And if it starts and ends with 1, the start and end offsets will be completely wrong due to the way you detect that the last value is 1.
The best way to solve both is to prepend and append A with 0 before the diff:
dA = diff([0 A 0]); %guarantees you have the same number of starts and ends.
midInd = floor((find(dA > 0) + find(dA < 0) - 1) / 2); %much simpler way of calculating mid indices
goerk
goerk el 6 de En. de 2016
You are right, for a 1 at the first position my will fail. Thanks for your very nice and short solution. With the correct concatenation it works fine.
dA = diff([0; A; 0]);

Iniciar sesión para comentar.


Stephen23
Stephen23 el 6 de En. de 2016
>> A = [0;0;0;0;0;0;1;1;1;0;0;0;0;0;0;1;0;0;0;0];
>> X = find(diff([0;A;0]));
>> Z = zeros(size(A));
>> Z(fix((X(1:2:end)+X(2:2:end)-1)/2)) = 1
Z =
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0

Meshooo
Meshooo el 7 de En. de 2016
Thank you all for the kind help and suggestions.

Categorías

Más información sobre Loops and Conditional Statements en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by