How to find 6 clusters

1 view (last 30 days)
Tim Navr
Tim Navr on 6 Apr 2016
Answered: Andrei Bobrov on 6 Apr 2016
Hi. Thanks for looking
I have a 6000x1 matrix. The values are split into 6 clusters, each cluster is identified by a number (the number is not known). In between the clusters there are many 0 values. What would be the best way to split them into 6 different matrices, eg
A= [0 0 1 1 1 0 0 0 200 200 200 0 0 300 300 300 300 0 0 0 0 0 0 425 425 425 425 425]'
I need to put the row values of all ones into a matrix, then all 200's into another and so on
Thank you for your help

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 6 Apr 2016
A = A(:);
l = A > 0;
z = cumsum([l(1);diff(l)==1]);
out = accumarray(z(l),A(l),[],@(x){x});

More Answers (1)

Ced
Ced on 6 Apr 2016
Edited: Ced on 6 Apr 2016
And each cluster is a repetition of the exact same number? Can the same number appear twice?
If not, you could do something like
A= [0 0 1 1 1 0 0 0 200 200 200 0 0 300 300 300 300 ...
0 0 0 0 0 0 425 425 425 425 425]';
A(A==0) = []; % remove zeros
clusters = unique(A);
N_clusters = length(clusters); % how many numbers
N_occurrences = arrayfun(@(x)sum(A==x),clusters); % how big are the clusters
new_mat = cell(N_clusters);
for i = 1:N_clusters
new_mat{i} = clusters(i)*ones(1,N_occurrences(i)); % one row for each cluster
end
To be fair, just saving N_clusters and N_occurrences already contains all the information, there is not really any need to create new_mat in general.
  1 Comment
Tim Navr
Tim Navr on 6 Apr 2016
Edited: Tim Navr on 6 Apr 2016
I need to keep the original row number of each repetitive number. Each cluster is the repetition of the same number (but I don't know the number). And the clusters can be variable in length and I don't know the number of members in the clusters. Also, there can only be 6 clusters. Thank you

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!