How to find duplicate values in 2d matrix?

16 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)

Categories

Find more on Graph and Network Algorithms in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!