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?
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?
grpstats
nel Statistics Toolbox può fare questo:
>> [grpstats(M(:,1), M(:,2), {'max'}) unique(M(:,2))]
ans =
3 5
2 6
1 7
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 –
In realtà, sto usando Octave, che non ha questa funzione. Sai se posso installarlo come plugin? Conosci una soluzione alternativa? – Gjorgji
È possibile utilizzare il codice di esempio da http://www.orient-lodge.com/node/3732 – itamarb
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
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
Suppongo che l'ottava avrà accumarray. Altrimenti non dovrebbe essere difficile ottenere il risultato eseguendo il looping dei valori 'unique' di' M (:, 1) ' –