Asked by Sudharsan Srinivasan
on 8 Oct 2019

I have a list of pair of numbers for example (please see below). In this example, if we look at the first column, the number one (1) repeats 3 times with its pair 54, 106 and 143. Similarly the number 24 repeats two times with its corresponding pair 87 and 288. What i want to do is group all those that repeat to one cluster. In the example listed below there are 12 pairs. I want to group 1 with 54, 106, and 143 and call it as one cluster and do the same thing with any such repeating pairs (number 24 in this example). In the end I will have 12 - 2 = 10 clusters. I would appreciate if some one could help with a matlab code for this.

Thanks,

Sudharsan

[1 54

1 106

1 143

5 90

24 87

64 244

5 202

7 270

24 288

25 176

26 206

27 161]

Answer by Fabio Freschi
on 8 Oct 2019

Edited by Fabio Freschi
on 8 Oct 2019

Accepted Answer

% unique indices

idx = unique(data(:,1));

% clusters

cluster = arrayfun(@(idx)data(data(:,1) == idx,2),idx,'UniformOutput',false);

Then you can access your clusters with idx(i)and cluster{i}, where i = 1:length(idx)

Sudharsan Srinivasan
on 8 Oct 2019

Hi Fabio, Thank you for your response. I don't quite understant this function and also what the number '2' is doing?

Thanks, Sudharsan

Fabio Freschi
on 8 Oct 2019

do you mean the 2 here?

cluster = arrayfun(@(idx)data(data(:,1) == idx,2),idx,'UniformOutput',false);

% ^

% |

I am taking the second column of data to check the values of the cluster.

arrayfun is not simple to understand for newbies, try with

doc arrayfun

Roughly speaking, it basically applys the comparison data(:,1) == idx of the cluster to each value of idx, one element at a time. Then I extract the values of the second column of data using the previous comparison data(data(:,1) == idx,2). 'UniformOutput',false is needed to deal with the output and put every value in a different entry of the cell array cluster

Sudharsan Srinivasan
on 8 Oct 2019

Sign in to comment.

Answer by Image Analyst
on 8 Oct 2019

I agree with Stephan and findgroups() -- there are 8 "clusters."

Below I use findgroups() to find the groups, then I store all the rows (actually the values in the second column) into a cell array, where each cell has the second values for that group. Try this:

m = [

1 54

1 106

1 143

5 90

24 87

64 244

5 202

7 270

24 288

25 176

26 206

27 161]

groupIndexes = findgroups(m(:, 1))

% Make clusters as a cell array because every group might have a different number of members.

for k = 1 : max(groupIndexes)

thisGroupRows = groupIndexes == k;

groupValues{k} = m(thisGroupRows, 2);

end

celldisp(groupValues) % Report to the command window

You'll see this:

groupIndexes =

1

1

1

2

4

8

2

3

4

5

6

7

groupValues{1} =

54

106

143

groupValues{2} =

90

202

groupValues{3} =

270

groupValues{4} =

87

288

groupValues{5} =

176

groupValues{6} =

206

groupValues{7} =

161

groupValues{8} =

244

Is that what you want? If you want, you could put those values into the second column of the cell array and have the group value (the column 1 values) in the first column.

Image Analyst
on 10 Oct 2019

Do you mean like this:

>> groupIDs = (m<=2)+1

groupIDs =

2 2

2 1

2 1

2 1

2 1

2 1

The top 2 touches the 1's and they have a path going down to the other 2's, so it seems like you want everything that's 2 or less in one group, and above 2 in another group.

Sudharsan Srinivasan
on 10 Oct 2019

Image Analyst
on 12 Oct 2019

Not totally, but try using this:

inBothColumns = m(:, 1) == m(:, 2);

This will give you a logical vector where both numbers in a row are the same.

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 4 Comments

## Stephan (view profile)

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/484244-counting-the-number-of-clusters#comment_754012

## Sudharsan Srinivasan (view profile)

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/484244-counting-the-number-of-clusters#comment_754021

## Stephan (view profile)

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/484244-counting-the-number-of-clusters#comment_754026

## Sudharsan Srinivasan (view profile)

## Direct link to this comment

https://au.mathworks.com/matlabcentral/answers/484244-counting-the-number-of-clusters#comment_754261

Sign in to comment.