Borrar filtros
Borrar filtros

Different groups of 1s

2 visualizaciones (últimos 30 días)
AB WAHEED LONE
AB WAHEED LONE el 25 de Mzo. de 2021
Editada: AB WAHEED LONE el 31 de Mzo. de 2021
Have been trying to solve this, but couldn't
Any help would be appreciated
I have an array A=[-1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1]
i want to get different groups of 1s like group1 contains ones with length 1 (for consecutive ones), second group contains ones with length 2 ,etc.
same approach for -1s
For 1s output shoud be [ 3 0 0 0 0 0 0 0 0 0 0 0 0 0 ]
For -1s outputs shd be [3 0 1 1 0 0 0 0 0 0 0 0 0 0 ].
  1 comentario
Matt J
Matt J el 25 de Mzo. de 2021
Why is the output [3 0 0 0 0 0 0,...]? I see 4 groups of length 1 in A.

Iniciar sesión para comentar.

Respuesta aceptada

Jan
Jan el 25 de Mzo. de 2021
Editada: Jan el 25 de Mzo. de 2021
If speed matters, compile the c file according to the instructions. If the problems are such tiny, it is sufficient to use the M-verion RunLength_M:
A = [-1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1];
value = 1;
[B, N] = RunLength_M(A == value);
Result = histcounts(N(B), 1:numel(A))
% [4 0 0 0 0 0 0 0 0 0 0 0 0 0] not [3 0 0 ...]
value = -1;
[B, N] = RunLength_M(A == value);
Result = histcounts(N(B), 1:numel(A))
% [3 0 1 1 0 0 0 0 0 0 0 0 0 0]
If RunLength_M is still an overkill for you, use:
function [b, n] = RunLengthEnc(x)
d = [true; diff(x(:)) ~= 0]; % TRUE if values change
b = x(d); % Elements without repetitions
k = find([d', true]); % Indices of changes
n = diff(k); % Number of repetitions
end
And if histcounts is too powerful also, a simple loop prodiuces the same result:
function H = myHist(N, Len)
H = zeros(1, Len);
for k = 1:numel(N)
H(N(k)) = H(N(k)) + 1;
end
end
Then the the main code looks like:
A = [-1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1];
value = 1;
[B, N] = RunLengthEnc(A == value);
Result = myHist(N(B), numel(A))
Or with 1 and -1 in the same run:
[B, N] = RunLengthEnc(A);
Result = myHist(N(B == 1), numel(A))
Result = myHist(N(B == -1), numel(A))
  3 comentarios
Jan
Jan el 30 de Mzo. de 2021
Without subfunctions? Then simply copy the code into the main function:
A = [-1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1];
d = [true; diff(x(:)) ~= 0]; % TRUE if values change
b = x(d); % Elements without repetitions
k = find([d', true]); % Indices of changes
n = diff(k); % Number of repetitions
Result = histcounts(n(b == 1), 1:numel(A))
Result = histcounts(n(b == -1), 1:numel(A))
AB WAHEED LONE
AB WAHEED LONE el 31 de Mzo. de 2021
Editada: AB WAHEED LONE el 31 de Mzo. de 2021
This seems shortest one,,Got it ,thank You

Iniciar sesión para comentar.

Más respuestas (1)

Matt J
Matt J el 25 de Mzo. de 2021
Editada: Matt J el 29 de Mzo. de 2021
Using the tools in this File Exchange submission,
A=[-1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1];
map=(A==-1);
L=groupFcn(@sum, map, groupTrue(map));
output=histcounts(L,1:numel(A)+1)
output = 1×14
3 0 1 1 0 0 0 0 0 0 0 0 0 0

Community Treasure Hunt

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

Start Hunting!

Translated by