Count the adjacent same elements in a vector

6 visualizaciones (últimos 30 días)
ayça kepçe
ayça kepçe el 1 de Jul. de 2019
Comentada: ayça kepçe el 9 de Jul. de 2019
Hello! Assume we have a vector of A=[1 1 1 2 2 3 3 3 3 3 1 1]. A has three 1, two 2, five 3 and two 1.
I need to create a vector, such as B=[3 2 5 2] and their corresponding value C=[1 2 3 1].
Maybe i should use a struct, not sure. Glad for some help :/
thx.

Respuesta aceptada

Matt J
Matt J el 1 de Jul. de 2019
Editada: Matt J el 1 de Jul. de 2019
L=cumsum([1, diff(A)~=0]);
B=splitapply(@sum,ones(size(A)),L)
C=splitapply(@min,A,L)
  2 comentarios
Jos (10584)
Jos (10584) el 1 de Jul. de 2019
Nice use of splitapply. Here is a simpler version of run-length encoding:
A=[1 1 1 2 2 3 3 3 3 3 1 1]
x = find([true diff(A)~=0])
B = diff([x numel(A)+1]) % run-lengths
C = A(x) % elements
ayça kepçe
ayça kepçe el 9 de Jul. de 2019
Thank you so much! But if i had seen it one week ago, i would not lost a week in a six week internship. Sometimes a tiny code piece like this saves the entire project...

Iniciar sesión para comentar.

Más respuestas (1)

Jos (10584)
Jos (10584) el 1 de Jul. de 2019
This is call run-length encoding, for which you can find excellent function on the File exchange. For instance, [shameless self promotion ;-) ], this one: https://uk.mathworks.com/matlabcentral/fileexchange/56131-runindex
A = [1 1 1 2 2 3 3 3 3 3 1 1]
[~, RLE] = runindex(A)
B = RLE(:,3)
C = RLE(:,1)
  1 comentario
ayça kepçe
ayça kepçe el 9 de Jul. de 2019
I tried to write a loop of my own, but didnt work so well :) your function will be in mind for incase!

Iniciar sesión para comentar.

Categorías

Más información sobre Operators and Elementary Operations en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by