2012-01-20 17 views
7

Quiero hacer lo que SQL's GROUP BY hace en MATLAB. Por ejemplo,GROUP BY en MATLAB

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

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

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

¿Cómo puedo hacer esto en Matlab?

+1

Supongo que la octava tendrá accumarray. De lo contrario, no debería ser difícil obtener el resultado al recorrer los valores 'únicos' de 'M (:, 1)' –

Respuesta

4

grpstats en la caja de herramientas estadísticas se pueden hacer esto:

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

ans = 

    3  5 
    2  6 
    1  7 
+0

Además, si sus datos están en una matriz de conjunto de datos (también de la caja de herramientas de estadísticas), el formato de salida de ' grpstats' es más agradable y automático. Vea aquí: http://www.mathworks.com/help/toolbox/stats/dataset.grpstats.html –

+1

En realidad, estoy usando Octave, que no tiene esta función. ¿Sabes si puedo instalarlo como complemento? ¿Conoces una solución alternativa? – Gjorgji

+0

Puede usar el código de ejemplo de http://www.orient-lodge.com/node/3732 – itamarb

2

Creo que hay una solución simple para esto. Esto es lo que he probado en Matlab y funcionó:

>> 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

Si no te importa hacer un poco de procesamiento previo para obtener el orden (o si la primera columna está muy bien construido a partir de 1 a n), que puede hacer de esta manera:

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

esto le dará:

14 
12 
13 

o en su caso:

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

Tenga en cuenta el orden. El segundo número, por ejemplo, corresponderá a M(:,1) == 2