How to find duplicate values in 2d matrix?

6 views (last 30 days)
Javier
Javier on 26 Jul 2019
Edited: Rik on 26 Jul 2019
Hello,
I have the following matrix
M =[ 1540 1685 6.90000000000000 24.2000000000000 14.6000000000000;
1540 1700 9.90000000000000 15.5000000000000 17.9000000000000;
1540 1701 9.90000000000000 12.4000000000000 17.9000000000000;
1540 1685 6.90000000000000 23.5000000000000 14.600000000000
1540 1700 9.90000000000000 15 17.9000000000000;
1540 1701 9.90000000000000 13.3000000000000 17.9000000000000;
1540 1680 6.90000000000000 26.2000000000000 14.4000000000000;
1540 1689 6.90000000000000 26.1000000000000 14.6000000000000;
1540 1680 6.90000000000000 24 14.6000000000000;
1540 1680 6.90000000000000 24 14.5000000000000;
1540 1688 7 23.5000000000000 14.6000000000000;
]
And I would like to identify the duplicates of that matrix based on the first two colums and extract them to furher operations. Thus, I would like to have a way to get a sub-matrices of the form
M11 = [ 1540 1700 9.90000000000000 15.5000000000000 17.9000000000000;
1540 1700 9.90000000000000 15 17.9000000000000;
]
M22 =[ 1540 1680 6.90000000000000 26.2000000000000 14.4000000000000;
1540 1680 6.90000000000000 24 14.5000000000000;
]
How can I achieve this? Could I use findgroups for this purpose?
Thanks in advance

Accepted Answer

Rik
Rik on 26 Jul 2019
Edited: Rik on 26 Jul 2019
You can indeed use findgroups. You should supply the first two columns as separate inputs.
G=findgroups(M(:,1),M(:,2));
Then I would suggest looping through the group IDs and fill a cell array. Don't use numbered variables, because they are hard to use in further analysis.
  2 Comments
Javier
Javier on 26 Jul 2019
Thanks Rik,
To be sure that I understand the output of findgroups, G variable contains group identifiers right? Meaning that for instance all elements with same M(:,1) and M(:,2) share same identifier, is that correct?
Then I could do something like
for k=1:max(G)
idx = G == k;
subM{k} = [M(idx,1) M(idx,2) M(idx,3) M(idx,4) M(idx,5)]
end
and I could check for the differences?
Rik
Rik on 26 Jul 2019
Edited: Rik on 26 Jul 2019
That should work. You can also use ismember to generate the idx vector (in which case that would become a logical vector). You can also more generally use M(idx,:) instead of specifying each column separately.
Also, starting off with subM=cell(1,max(G)); is probably a good idea.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!