web-dev-qa-db-fra.com

Comment obtenir que MATLAB affiche l'index de la valeur minimale dans un tableau 2D?

J'essaie d'écrire un script dans MATLAB qui trouve l'emplacement de la valeur minimale d'un tableau 2D de nombres. Je suis certain qu'il n'y a qu'un seul minimum dans ce tableau, donc avoir plusieurs emplacements dans le tableau avec la même valeur minimale n'est pas un problème. Je peux trouver le minimum value du tableau, mais dans un tableau 30x30, je voudrais savoir dans quelle ligne et quelle colonne se trouve cette valeur minimale. 

18
Mike C

En variante, combinez min pour obtenir la valeur minimale et find pour renvoyer l'index. Si vous avez déjà calculé le minimum, utilisez simplement find.

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

r =
     1
c =
     8

Ou, en fonction de la manière dont vous souhaitez utiliser les informations d'emplacement, vous pouvez définir une matrice logique, auquel cas l'adressage logique peut être utilisé pour vous fournir une table de vérité.

>> a=magic(30);
>> locn=(a==min(min(a)));
28
Adrian

Vous pouvez transformer la matrice en un vecteur, trouver l'index du minimum à l'aide de MIN puis convertir cet index linéaire en un index de 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 

 >> [valeur, index] = min (remodeler (x, numel (x), 1)); 
 >> [i, j] = ind2sub (taille (x ), index) 

 i = 

 3 


 J = 

 2 
13
b3.

Regardez la description de la fonction min . Il peut renvoyer la valeur minimale ainsi que l'index. Pour un tableau à deux dimensions, appelez-le deux fois.

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

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

Edit: La solution de @ b3 est probablement plus élégante du point de vue informatique (plus rapide et nécessite moins d'espace temporaire)

7
groovingandi

Une autre solution utilisant une fonction en ligne fonctionnera. 

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

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

    r =
         1

    c =
         8
0
Agriculturist

Pour rechercher min ou max dans un sous-ensemble d'un vecteur - Si A est un vecteur et que "lowerBound" et "upperBound" sont les bornes du vecteur parmi lesquelles vous devez rechercher la valeur max (ou min), utilisez cette commande -

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

Cela renvoie "Valeur" en tant que valeur minimale ou maximale entre A(lowerBound) et A(uppedBound) et "Index" comme pour "lowerBound" en tant que décalage. Donc, pour trouver l'index absolu, vous devez ajouter "lowerBound" à l'index.

0
codingJitters