Increase counter for each element in array

Hey,
given A = [1 1 3 4 5 6 6 7 7 7]. How could I return the sequence B =[1 2 1 1 1 1 2 1 2 3] such that each duplicate is counted and B is the same size as A?
I appreciate your help!

 Respuesta aceptada

madhan ravi
madhan ravi el 17 de Jun. de 2020
ix = A(:) == unique(A);
B = nonzeros(cumsum(ix) .* ix)

6 comentarios

Dario Walter
Dario Walter el 17 de Jun. de 2020
Really nice solution madhan. It works nicely for small arrays of A. Yet, A is a vector of 70000 entries in my case. Your approach results in an out of memory error :/
u = unique(A);
B = cell(1,numel(u));
for k = 1:numel(u)
ix = A == u(k);
B{k} = nonzeros(cumsum(ix) .* ix).';
end
B = [B{:}];
KSSV
KSSV el 18 de Jun. de 2020
Editada: KSSV el 18 de Jun. de 2020
+1 I don't know this....(For the first answer)
Dario Walter
Dario Walter el 18 de Jun. de 2020
Editada: Dario Walter el 18 de Jun. de 2020
Hey, thanks for your help so far. This approach only works for sorted data (which I am not allowed to do in my approach). Bad example I chose, sorry for that. What about B = [4 4 3 3 3 2 2 1 1 7 7 9 9] (each unique number only appears in a sequence in my problem, so that, for instance, C = [4 4 3 4] does not exist.
[B,I] = sort(A,'ascend') does neither help.
madhan ravi
madhan ravi el 18 de Jun. de 2020
I knew you would come up with that question. That’s why you should experiment with 'stable' option in unique function.
Dario Walter
Dario Walter el 18 de Jun. de 2020
Well done Madhan :). Thanks a lot!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Licensing on Cloud Platforms en Centro de ayuda y File Exchange.

Productos

Versión

R2020a

Etiquetas

Preguntada:

el 17 de Jun. de 2020

Comentada:

el 18 de Jun. de 2020

Community Treasure Hunt

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

Start Hunting!

Translated by