Effacer les filtres
Effacer les filtres

How to split a vector into unequal sections?

39 vues (au cours des 30 derniers jours)
Dominik Mattioli
Dominik Mattioli le 24 Mai 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

Réponse acceptée

Stephen23
Stephen23 le 24 Mai 2017
Modifié(e) : Stephen23 le 24 Mai 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.

Plus de réponses (1)

Jan
Jan le 24 Mai 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 commentaire
Dominik Mattioli
Dominik Mattioli le 24 Mai 2017
This is awesome, thank you! Do you have this in Python as well?

Connectez-vous pour commenter.

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by