2011-02-22 11 views
17

Sto provando a scrivere uno script in MATLAB che trova la posizione del valore minimo di una matrice 2D di numeri. Sono certo che c'è solo un minimo in questo array, quindi avere più posizioni nell'array con lo stesso valore minimo non è un problema. Posso trovare il valore minimo della matrice, ma in una matrice 30x30, desidero sapere quale riga e colonna valore minimo è in.Come ottenere MATLAB per visualizzare l'indice del valore minimo in un array 2D?

risposta

28

in una versione alternativa, si combinano minuti per raggiungere il valore minimo e trovare per restituire l'indice, se hai già calcolato il minimo poi basta usare trovare.

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

r = 
    1 
c = 
    8 

O a seconda di come si desidera utilizzare le informazioni sulla posizione si consiglia di definirla con una matrice logica, invece, nel qual caso indirizzamento logico può essere utilizzato per dare una tabella di verità.

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

Grazie !! esattamente quello di cui avevo bisogno! –

7

un'occhiata alla descrizione della funzione min. Può restituire il valore minimo e l'indice. Per un array bidimensionale, chiamalo due volte.

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

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

Edit: @ soluzione b3 è probabilmente computazionalmente più elegante (più veloce e ha bisogno di meno spazio temporaneo)

13

Si potrebbe rimodellare la matrice per un vettore, trovare l'indice del minimo utilizzando MIN e poi convertire questo Indice lineare in un indice di matrice:

 
>> 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 soluzione elegante! – groovingandi

+6

puoi usare x (:) invece di rimodellare() per salvare alcuni caratteri. – zellus

+0

@zellus: Grazie per avermelo ricordato! Ho avuto questa sensazione fastidiosa che ci fosse un altro modo per farlo. –

0

Per trovare min o max in un sottogruppo di un vettore - Se A è un vettore e "lowerbound" e "upper bound" sono i limiti del vettore tra i quali è necessario trovare il massimo (o min valore), quindi utilizzare questo comando -

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

Ciò restituisce "valore" come il valore minimo o massimo tra A (limiteinferiore) e A (uppedBound) e "Indice" come con "limite inferiore", come l'offset. Quindi, per trovare l'indice assoluto, è necessario aggiungere "lowerBound" all'indice.

0

Una soluzione alternativa che utilizza una funzione inline funzionerà.

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

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

    r = 
     1 

    c = 
     8 
Problemi correlati