2011-02-22 31 views
17

Estoy tratando de escribir un script en MATLAB que encuentre la ubicación del valor mínimo de una matriz 2D de números. Estoy seguro de que solo hay 1 mínimo en este conjunto, por lo que tener múltiples ubicaciones en el conjunto con el mismo valor mínimo no es un problema. Puedo encontrar el mínimo valor de la matriz, pero en una matriz de 30x30, me gustaría saber qué fila y columna que el valor mínimo es de.¿Cómo hacer que MATLAB muestre el índice del valor mínimo en una matriz 2D?

Respuesta

28

Como una versión alternativa, se combinan min para obtener el valor mínimo y volver a encontrar el índice, si ya ha calculado el mínimo, entonces sólo tiene que utilizar encontrar.

>> a=magic(30); 
>> [r,c]=find(a==min(min(a))) 

r = 
    1 
c = 
    8 

O dependiendo de cómo desea utilizar la información de ubicación es posible que desee definirlo con una matriz lógica en su lugar, en cuyo caso direccionamiento lógico se puede utilizar para darle una tabla de verdad.

>> a=magic(30); 
>> locn=(a==min(min(a))); 
+0

¡Gracias! exactamente lo que necesitaba! –

7

Mira la descripción de la función min. Puede devolver el valor mínimo y el índice. Para una matriz bidimensional, simplemente llámala dos veces.

A = rand(30); % some matrix 
[minColVal, minColIdx] = min(A); 
[minRowVal, minRowIdx] = min(minColVal); 

minVal = minRowVal; 
minValIdx = [minColIdx(minRowIdx), minRowIdx]; 

Editar: @ solución de B3 es probablemente computacionalmente más elegante (más rápido y requiere menos espacio temporal)

13

Se podría formar de nuevo la matriz de un vector, encontrar el índice del mínimo utilizando MIN y luego convertir este índice lineal en un índice de la matriz:

 
>> x = randi(5, 5) 

x = 

    5  4  4  2  4 
    4  2  4  5  5 
    3  1  3  4  3 
    3  4  2  5  1 
    2  4  5  3  5 

>> [value, index] = min(reshape(x, numel(x), 1)); 
>> [i,j] = ind2sub(size(x), index) 

i = 

    3 


j = 

    2 
+0

+1 elegant solution! – groovingandi

+6

puede usar x (:) en lugar de cambiar la forma() para guardar algunos caracteres. – zellus

+0

@zellus: ¡Gracias por recordarme! Tenía la sensación de que había otra forma de hacerlo. –

0

Para encontrar valores mínimos y máximos en un subconjunto de un vector - Si A es un vector y "límite inferior" y "límite superior" son los límites del vector entre los que usted necesita para encontrar el máximo (o mínimo) valor, a continuación, utilizar este comando -

[Value,Index]=min(A(lowerBound:upperBound)); 

esto devuelve "valor" como el valor máximo o mínimo entre A (límite inferior) y A (uppedBound) y "Index" como con "límite inferior", como el offset. Entonces, para encontrar el índice absoluto, debe agregar "lowerBound" al índice.

0

Una solución alternativa que utiliza una función en línea funcionará.

>> min_index = @(matrix) find(matrix == min(reshape(matrix, [1,numel(matrix)]))); 

    >> a=magic(30); 
    >> [r,c]=min_index(a) 

    r = 
     1 

    c = 
     8 
Cuestiones relacionadas