2017-09-29 1 views
0

J'essaie d'écrire du code Fortran 95 pour imiter ce que j'ai fait dans MATLAB mais j'ai du mal à accéder aux indices de tableau. le code est beaucoup plus complexe que ce qui est montré ci-dessous, mais c'est l'essentiel. Je préférerais éviter les boucles.Fortran indices logiques de Matlab

par exemple. -> commandes Matlab. Supposons que a, b, c ont la même taille.

indx=find(a<0); % find all negative values of "a" 
    b(indx)=30.; % set those same elements in different array "b" to 30. 
    c(indx)=b(indx)./a(indx) 
    etc. 
    etc. 

Comment puis-je stocker et utiliser ces indices de « un » tableau et fonctionnent sur les mêmes indices d'autres tableaux Fortran?

+0

double possible de (https://stackoverflow.com/questions/21435589/fortran -equivalent-of-numpy-where-function) – francescalus

+0

c'est proche, mais cela retourne un tableau logique qui n'est pas utile pour générer les indices à appliquer aux autres tableaux. –

+0

Vous utilisez 'pack' et le masque logique pour vous donner un tableau d'index qui agissent comme un indice de vecteur, ou utilisez une instruction/construction' where' avec le masque. – francescalus

Répondre

1

Vous voulez quelque chose comme

$ cat pack.f90 
Program pack_test 

    Implicit None 

    Real, Dimension(1:5) :: a 
    Real, Dimension(1: 5) :: b, c 

    Integer, Dimension(:), Allocatable :: indx 

    Integer :: i 

    a = [ 1, -2, 3, -4, 5 ] 
    b = a 
    c = a 

    indx = Pack([ (i, i = Lbound(a, Dim = 1) , & 
          Ubound(a, Dim = 1)) ], & 
       a < 0) 

    b(indx) = 30.0 
    c(indx) = b(indx)/a(indx) 

    Write(*, *) c 

End Program pack_test 

i[email protected] ~ 
$ gfortran -O -Wall -Wextra -fcheck=all -std=f2003 pack.f90 

[email protected] ~ 
$ ./a.exe 
    1.00000000  -15.0000000  3.00000000  -7.50000000  5.00000000 
1

Il est pas toujours nécessaire de créer le tableau d'index et si ce ne where peut être l'outil à utiliser. Par exemple, le code de @ réponse de IanBush pourrait être modifiée comme ceci: [? Fortran équivalent de la fonction numpy.where()]

Program where_test 

    Implicit None 

    Real, Dimension(1:5) :: a 
    Real, Dimension(1: 5) :: b, c 

    Integer :: i 

    a = [ 1, -2, 3, -4, 5 ] 
    b = a 
    c = a 

    WHERE(a<0) b = 30.0 
    WHERE(a<0) c = b/a 

    Write(*, *) c 

End Program where_test 
+0

Bon point, dans ce cas, c'est plus simple, aurait dû y penser. Votez de moi. –