2012-01-20 4 views
7

Voglio fare ciò che SQL GROUP BY fa in MATLAB. Ad esempio,GROUP BY in MATLAB

M = [
1, 5;
2, 5;
3, 5;
1, 6;
2, 6;
1,7]

SQL: SELECT MAX (c1), c2 DA M (c1, c2) GROUP BY 2

Risultato = [
3, 5;
2, 6;
1, 7]

Come posso farlo in Matlab?

+1

Suppongo che l'ottava avrà accumarray. Altrimenti non dovrebbe essere difficile ottenere il risultato eseguendo il looping dei valori 'unique' di' M (:, 1) ' –

risposta

4

grpstats nel Statistics Toolbox può fare questo:

>> [grpstats(M(:,1), M(:,2), {'max'}) unique(M(:,2))] 

ans = 

    3  5 
    2  6 
    1  7 
+0

Inoltre, se i tuoi dati sono in un array di dataset (anche da toolbox stats), la formattazione di output di' grpstats' è più bello e automatico. Vedi qui: http://www.mathworks.com/help/toolbox/stats/dataset.grpstats.html –

+1

In realtà, sto usando Octave, che non ha questa funzione. Sai se posso installarlo come plugin? Conosci una soluzione alternativa? – Gjorgji

+0

È possibile utilizzare il codice di esempio da http://www.orient-lodge.com/node/3732 – itamarb

2

penso che ci sia una soluzione semplice a questo. Ecco quello che ho provato su Matlab e ha funzionato:

>> M = [ 
1, 5; 
2, 5; 
3, 5; 
1, 6; 
2, 6; 
1,7 ]; 

>> grpstats(M,M(:,2),{'max'}) 

ans = 

    3  5 
    2  6 
    1  7 
3

Se non ti dispiace fare un po 'di pre-elaborazione per ottenere l'ordine (o se la prima colonna è ben costruito 1-n), si può fare in questo modo:

accumarray([1 2 3 1]',[11 12 13 14]',[],@max) 

questo darà:

14 
12 
13 

o nel vostro caso:

01.235.
accumarray(M(:,1),M(:,2),[],@max) 

Annotare l'ordine. Il secondo numero, ad esempio, corrisponderà a M(:,1) == 2