Trouver l'indice minimum d'une matrice 2d avec une ou plusieurs conditions en fortran


Considérons une matrice "a" de dimension 3$\times$2 (3 lignes, 2 colonnes) comme dans cet exemple:

\begin{equation}
\left(
\begin{array}{cc}
5 & 9 \\
2 & 7 \\
6 & 4
\end{array}
\right)
\end{equation}

Pour trouver l'indice correspondant à la valeur minimum de la matrice "a" on peut utiliser la fonction fortran MINLOC qui donne ici (2,1) (deuxième ligne, 1ere colonne). A partir de cette function il est alors possible d'ajouter des conditions: par exemple si on veut trouver l'indice de la ligne avec la plus petite valeur sur la deuxième colonnes MINLOC(a(:,2)) qui donne ici 3 (car 4 est la plus petite valeur de la deuxième colonnes). Pour aller encore plus loin il est possible d'utiliser un MASK pour contraindre davantage la recherche. Exemple de code fortran

program test

implicit none

integer, dimension(3,2) :: a

a(1,1) = 5
a(1,2) = 9
a(2,1) = 2
a(2,2) = 7
a(3,1) = 6
a(3,2) = 4

write(6,*) 'Test 1 :', MINLOC(a)   
write(6,*) 'Test 2 :', MINLOC(a(:,2))  
write(6,*) 'Test 3 :', MINLOC(a(:,1), MASK=(a(:,1) > 4))   
write(6,*) 'Test 4 :', MINLOC(a(:,1), MASK=(a(:,1) > 4 .AND. a(:,2) < 5))

end program test

donne comme résultat:

 Test 1 :           2           1
 Test 2 :           3
 Test 3 :           1
 Test 4 :           3

Exemple d'application: trouver la ligne d'un fichier respectant plusieurs conditions. Supposons que l'on dispose dun fichier data.txt comme ceci:

2008 10 1 13232
2008 10 2 3132
2008 10 3 67
2008 10 4 767 
2008 10 5 67 
2008 10 6 465 
2008 10 7 7754
2008 10 8 6465 
2008 10 9 656
2008 10 10 345
2008 10 11 577

et on veut trouver l'indice de la ligne qui commence avec 2008, 10 et 8 :

program test

implicit none

integer :: i,j
integer, dimension(11,4) :: a

open(1,file='fortran_data_test.txt')
do i=1, 11
    read(1,*) (a(i,j),j=1,4)
end do
close(1)

write(6,*) MINLOC(a(:,1), MASK=(a(:,1) == 2008 .AND. a(:,2) ==10 .AND. a(:,3) == 8))

end program test

qui donne ici 8 (car la huitième lignes commence bien par 2008 10 8 )

Recherches associées