Ordenar una matriz en Matlab en base a una fila o columna

Publicado el 14 octubre 2019 por Daniel Rodríguez @analyticslane

En Matlab existe la función sort() para ordenar los elementos de un vector o matriz. Pero cuando es necesario ordenar una matriz en Matlab en base a los valores de una fila o columna no existe una función análoga. Para solucionar este problema es necesario utilizar el segundo valor que devuelve la función sort() y los métodos para seleccionar elementos en Matlab.

La función sort()

La función sort() permite ordenar los elementos de una vector o matriz. Por defecto la ordenación es de forma ascender, aunque se puede indicar la dirección en los parámetros de la función. Al consultar la documentación de la función se puede observar que esta devuelve dos parámetros, el primero la matriz ordenada y el segundo una matriz con el orden de ordenación. Por ejemplo, para un vector de tres elementos se puede ver:

m = [1 5 3];
[s, o] = sort(m)
s =

     1     3     5


o =

     1     3     2

En este caso se puede ver que s es la matriz ordenada y o es orden en el que es necesario seleccionar los elementos del vector original m para obtener s. Así se puede obtener s a partir de m ordenandolo con o.

m(o)
ans =

     1     3     5

Esto se puede utilizar para ordenar una matriz en Matlab en base a una fila o columna.

Ordenar una matriz en Matlab en base a una columna

Ahora, si se utiliza sort() para ordenar una columna de una matriz se puede usar el segundo resultado para ordenar la matriz en base a esta. Para esto se pueden utilizar los métodos básicos de Matlab para seleccionar una columna de la matriz. Por ejemplo, la primera. En el siguiente trozo de código se puede ver cómo ordenar una matriz aleatoria de enteros en base a su primera columna.

data = randi(40, 6, 4)

[~, s] = sort(data(:, 1))
data(s, :)

En una ejecución aleatoria se obtienen los valores.

data =

     9    10    18    11
    13     7     8    17
    19    10    37    24
    10    18    40    11
    34    13    18    25
     8    37     5    29


s =

     6
     1
     4
     2
     3
     5


ans =

     8    37     5    29
     9    10    18    11
    10    18    40    11
    13     7     8    17
    19    10    37    24
    34    13    18    25

Ordenar una matriz en Matlab en base a una fila

La ordenación también se puede hacer en base a una fila, para ello simplemente se ha de ordenar la fina en lugar de la columna. Esto se puede hacer con el siguiente ejemplo:

[~, s] = sort(data(1, :))
data(:, s)

Con el que se obtiene.

s =

     1     2     4     3


ans =

     9    10    11    18
    13     7    17     8
    19    10    24    37
    10    18    11    40
    34    13    25    18
     8    37    29     5

Ordenar en orden descender

Finalmente, se puede indicar a la función sort() que ordene los elementos de forma descentre simplemente pasando la palabra desc como segundo parámetro de la función. Lo que se puede aplicar al ejemplo anterior.

[~, s] = sort(data(:, 1), 'desc')
data(s, :)
s =

     5
     3
     2
     4
     1
     6


ans =

    34    13    18    25
    19    10    37    24
    13     7     8    17
    10    18    40    11
     9    10    18    11
     8    37     5    29

Conclusiones

En esta entrada se ha visto cómo combinar la función sort() con los métodos para seleccionar elementos en para ordenar los elementos de una matriz en base a una fila o columna. Una tarea que es bastante habitual. Por ejemplo, a la hora de ordenar los resultados de unas medidas.

Este truco también se puede utilizar para ordenar los elementos de un vector en base a otro que tenga el mismo tamaño. Lo que es de utilidad cuando se tienen datos relacionados en dos elementos.

Imágenes: Pixabay (congerdesig)