if I have
A=[1 2; 2 4; 3 4; 4 1; 5 1; 6 4; 7 4; 8 2; 9 1; 10 1]
where 1st column represents customer ID and 2nd column shows Clustering Number. How can I group customer ID into a same cluster such as
cluster1=[4 5 9 10], cluster2=[1,8], cluster3=[ ], cluster4=[2,3,6,7]

 Réponse acceptée

ANKUR KUMAR
ANKUR KUMAR le 8 Jan 2018
Modifié(e) : ANKUR KUMAR le 8 Jan 2018
A=[1 2; 2 4; 3 4; 4 1; 5 1; 6 4; 7 4; 8 2; 9 1; 10 1]
id=unique(A(:,2))
for ii=1:length(id)
iid{ii}=A(find(A(:,2)==id(ii)),1)
end
you can see the outputs just by entering iid{1}

3 commentaires

Guillaume
Guillaume le 8 Jan 2018
Modifié(e) : Guillaume le 8 Jan 2018
Never mind that this answer is incorrect (try it when the customer id is not equal to the row number such as A = [1234 1;4567 1]), find is usually unnecessary.
If you wanted to use a loop, the body of the loop should be:
for ii = 1 : numel(id)
iid{ii} = A(A(:, 2) == id(ii), 1)
end
Also, you should preallocate the cell array rather than growing it in the loop, wasting time reallocating a new cell array at each step. So before the loop:
iid = cell(numel(id), 1);
for ...
Or use accumarray which avoids all these issues...
edit: I see the answer has been edited to correct the bug so the answer now works. find is still unnecessary. It just slows the code for no benefit.
ANKUR KUMAR
ANKUR KUMAR le 8 Jan 2018
Sir, I am just a student. That was my mistake. Sorry for this.

It's fine. Don't worry. I'm a rookie also. It's not your fault. Let's share.

Connectez-vous pour commenter.

Plus de réponses (1)

Guillaume
Guillaume le 8 Jan 2018
Assuming your clustering numbers are all strictly positive integers:
accumarray(A(:, 2), A(:, 1), [], @(custs) {custs})

Catégories

En savoir plus sur Loops and Conditional Statements dans Centre d'aide et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by