2011-01-24 13 views
5

Sto cercando una funzione per trovare le righe più ripetute (cioè modali) di una matrice in MATLAB. Qualcosa di simile:Trova la riga più ripetuta in una matrice MATLAB

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

A = 

0  1 
2  3 
0  1 
3  4 

poi eseguire:

>> mode(A, 'rows') 

sarebbero tornati [0, 1], idealmente con una seconda uscita dando gli indici in cui si è verificato questa riga (cioè [1, 3]'.)

Qualcuno sa di quali una funzione?

risposta

13

È possibile utilizzare UNIQUE per ottenere indici di riga univoci e quindi chiamare MODE su di essi.

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

Grazie. Penso che l'ultima riga dovrebbe essere qualcosa del tipo: 'whereIdx = find (uIdx (modeIdx) == uIdx)' comunque. –

+0

@ Bill Cheatham: Sì, certo. Questo è quello che ottengo per aggiungere una riga * dopo * test. – Jonas

+2

potrebbe non essere corretto. Prova A = [2, 3; 0, 1; 3, 4; 0, 1] – sinoTrinity

2

La risposta potrebbe non essere corretta. Prova A = [2, 3; 0, 1; 3, 4; 0, 1]. Dovrebbe essere il seguente:

[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