How to find duplicate values in 2d matrix?

6 vues (au cours des 30 derniers jours)
Javier
Javier le 26 Juil 2019
Modifié(e) : Rik le 26 Juil 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
  2 commentaires
KSSV
KSSV le 26 Juil 2019
Read about unique
Jan
Jan le 26 Juil 2019
This is a 2D matrix, not 4D.

Connectez-vous pour commenter.

Réponse acceptée

Rik
Rik le 26 Juil 2019
Modifié(e) : Rik le 26 Juil 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 commentaires
Javier
Javier le 26 Juil 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 le 26 Juil 2019
Modifié(e) : Rik le 26 Juil 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.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by