2017-09-29 3 views
0

MATLAB에서 행한 것을 모방하기 위해 Fortran 95 코드를 작성하려고하지만 배열 인덱스에 액세스하는 데 어려움을 겪고 있습니다. 코드는 아래에 표시된 것보다 훨씬 복잡하지만 이것이 요지입니다. 나는 do 루프를 피하는 것을 선호한다.Matlab의 Fortran 논리 인덱스

-> Matlab 명령. a, b, c가 같은 크기라고 가정합니다.

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. 

어떻게 저장하고 포트란에서 다른 배열에서 동일한 인덱스의 ""배열에서 해당 인덱스를 사용하여 조작 할 수 있습니다?

+0

의 사용 가능한 복제 (https://stackoverflow.com/questions/21435589/fortran -equivalent-of-numpy-where-function) – francescalus

+0

가깝지만 다른 배열에 적용 할 인덱스를 생성하는 데 유용하지 않은 논리 배열을 반환합니다. –

+0

'pack'과 논리적 마스크를 사용하여 벡터 첨자의 역할을하는 인덱스의 배열을 제공하거나 마스크와 함께'where' 문/구조를 사용합니다. – francescalus

답변

1

당신은 그것은 인덱스 배열을 만들기 위해 항상 필요한 것은 아니다 그렇지 않은 경우 where가 사용할 수있는 권리 도구가 될 수 있습니다

$ 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 

[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

같은 것을 원한다. 예를 들어, IanBush의 대답 @의 코드는 다음과 같이 수정할 수 있습니다 : [? 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

좋은 점,이 경우 이것은 더 간단합니다. 생각해야합니다. 나 한테서 투표 해. –