2011-01-24 5 views
5

Je cherche une fonction pour trouver les lignes les plus répétées (c'est-à-dire modales) d'une matrice dans MATLAB. Quelque chose comme:Trouver la ligne la plus répétée dans une matrice MATLAB

>> A = [0, 1; 2, 3; 0, 1; 3, 4] 

A = 

0  1 
2  3 
0  1 
3  4 

Puis en cours d'exécution:

>> mode(A, 'rows') 

retournerait [0, 1], idéalement avec une deuxième sortie donnant les indices où cette ligne se sont produits ([1, 3]'.)

Est-ce que quelqu'un sait de cette une fonction?

Répondre

13

Vous pouvez utiliser UNIQUE pour obtenir des index de ligne uniques, puis appeler le MODE.

[uA,~,uIdx] = unique(A,'rows'); 
modeIdx = mode(uIdx); 
modeRow = uA(modeIdx,:) %# the first output argument 
whereIdx = find(uIdx==modeIdx) %# the second output argument 
+1

Merci. Je pense que la dernière ligne devrait être quelque chose comme: 'whereIdx = trouver (uIdx (modeIdx) == uIdx)' though. –

+0

@Bill Cheatham: Oui, bien sûr. C'est ce que j'ai pour ajouter une ligne * après * test. – Jonas

+2

cela peut ne pas être exact. Essayez A = [2, 3; 0, 1; 3, 4; 0, 1] – sinoTrinity

2

La réponse peut ne pas être exacte. Essayez A = [2, 3; 0, 1; 3, 4; 0, 1]. Ce devrait être le suivant:

[a, b, uIdx] = unique(A,'rows'); 
modeIdx = mode(uIdx); 
modeRow = a(modeIdx,:) %# the first output argument 
whereIdx = find(ismember(A, modeRow, 'rows')) %# the second output argument 
Questions connexes