How to split a vector into unequal sections?

43 visualizaciones (últimos 30 días)
Dominik Mattioli
Dominik Mattioli el 24 de Mayo de 2017
Comentada: Dominik Mattioli el 24 de Mayo de 2017
I know that some similar questions have previously been asked, but I think this problem might be a little unique. For some context, I have this vector V whose values never decrease (is there a word for this?) and whose min (1) and max (5) I always know.:
V = [1;1;2;2;2;2;3;4;4;5];
I'd like to somehow get the vertices for each "grouping" g (or some other format of distinction such as indexing) of V for like-numbers, i.e.
g1 = [1;1]
g2 = [2;2;2;2];
g3 = 3;
g4 = [4;4];
g5 = 5;
What I have right now seems ad hoc and mendable and I am not sure if it will be ideal for large data sets that I intend to apply this toward. I imagine an easier solution would simply obtain indices for each grouping. This is what I've done:
Vchange = logical(diff(V));
maxG = 5; % For this case.
Gidx = 1; % Begin first grouping with minimum.
G = cell(maxG,1); % Initialize output.
G{1} = V(1);
iter = length(Vchange); % Number of iterations.
for Vidx = 1:iter
if Vchange(i) % Vertex has changed;
Gidx = Gidx + 1; % continue with next vertex.
end
G{Gidx} = [G{Gidx},V(i)];
end

Respuesta aceptada

Stephen23
Stephen23 el 24 de Mayo de 2017
Editada: Stephen23 el 24 de Mayo de 2017
>> V = [1;1;2;2;2;2;3;4;4;5];
>> D = diff(find([1;diff(V)~=0;1]));
>> C = mat2cell(V,D,1);
>> C{:}
ans =
1
1
ans =
2
2
2
2
ans =
3
ans =
4
4
ans =
5
You can use cell array indexing to access the numeric vectors in C.

Más respuestas (1)

Jan
Jan el 24 de Mayo de 2017
If you have a large data set, creating a bunch of variables can waste memory. Note that each array has an overhead of about 100 Byte. In addition all sub arrays contain the same value only, which is quite redundant. A smarter way of indexing might be better:
[B, N, Ind] = RunLength(A);
Now B contains the value, N the number of elements and Ind the index related to A. This takes much less memory and this might accelerate your code.
  1 comentario
Dominik Mattioli
Dominik Mattioli el 24 de Mayo de 2017
This is awesome, thank you! Do you have this in Python as well?

Iniciar sesión para comentar.

Categorías

Más información sobre Matrix Indexing 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