Fortran-어레이

배열은 동일한 유형의 요소의 고정 크기 순차 컬렉션을 저장할 수 있습니다. 배열은 데이터 모음을 저장하는 데 사용되지만 배열을 동일한 유형의 변수 모음으로 생각하는 것이 더 유용합니다.

모든 어레이는 연속적인 메모리 위치로 구성됩니다. 가장 낮은 주소는 첫 번째 요소에 해당하고 가장 높은 주소는 마지막 요소에 해당합니다.

숫자 (1) 숫자 (2) 숫자 (3) 숫자 (4)

배열은 1 차원 (벡터), 2 차원 (행렬) 일 수 있으며 Fortran을 사용하면 최대 7 차원 배열을 만들 수 있습니다.

배열 선언

배열은 dimension 속성.

예를 들어, 5 개의 요소를 포함하는 실수의 number라는 1 차원 배열을 선언하려면 다음과 같이 작성합니다.

real, dimension(5) :: numbers

배열의 개별 요소는 첨자를 지정하여 참조됩니다. 배열의 첫 번째 요소에는 1의 첨자가 있습니다. 배열 번호에는 숫자 (1), 숫자 (2), 숫자 (3), 숫자 (4) 및 숫자 (5)의 5 개의 실수 변수가 포함됩니다.

matrix라는 이름의 5 x 5 2 차원 정수 배열을 만들려면 다음과 같이 작성합니다.

integer, dimension (5,5) :: matrix

예를 들어 다음과 같이 명시 적 하한이있는 배열을 선언 할 수도 있습니다.

real, dimension(2:6) :: numbers
integer, dimension (-3:2,0:4) :: matrix

값 할당

다음과 같이 개별 구성원에게 값을 할당 할 수 있습니다.

numbers(1) = 2.0

또는 루프를 사용할 수 있습니다.

do i  =1,5
   numbers(i) = i * 2.0
end do

1 차원 배열 요소는 다음과 같이 배열 생성자라고하는 약식 기호를 사용하여 값을 직접 할당 할 수 있습니다.

numbers = (/1.5, 3.2,4.5,0.9,7.2 /)

please note that there are no spaces allowed between the brackets ‘( ‘and the back slash ‘/’

다음 예는 위에서 설명한 개념을 보여줍니다.

program arrayProg

   real :: numbers(5) !one dimensional integer array
   integer :: matrix(3,3), i , j !two dimensional real array
   
   !assigning some values to the array numbers
   do i=1,5
      numbers(i) = i * 2.0
   end do
   
   !display the values
   do i = 1, 5
      Print *, numbers(i)
   end do
   
   !assigning some values to the array matrix
   do i=1,3
      do j = 1, 3
         matrix(i, j) = i+j
      end do
   end do
   
   !display the values
   do i=1,3
      do j = 1, 3
         Print *, matrix(i,j)
      end do
   end do
   
   !short hand assignment
   numbers = (/1.5, 3.2,4.5,0.9,7.2 /)
   
   !display the values
   do i = 1, 5
      Print *, numbers(i)
   end do
   
end program arrayProg

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

2.00000000    
 4.00000000    
 6.00000000    
 8.00000000    
 10.0000000    
         2
         3
         4
         3
         4
         5
         4
         5
         6
 1.50000000    
 3.20000005    
 4.50000000    
0.899999976    
 7.19999981

일부 어레이 관련 용어

다음 표는 배열 관련 용어를 제공합니다.

기간 의미
계급 배열의 차원 수입니다. 예를 들어, matrix라는 배열의 경우 rank는 2이고 numbers라는 배열의 경우 rank는 1입니다.
범위 차원을 따르는 요소의 수입니다. 예를 들어, 배열 번호의 범위는 5이고 matrix라는 배열의 범위는 두 차원 모두입니다.
모양 배열의 모양은 각 차원의 요소 수 (범위)를 포함하는 1 차원 정수 배열입니다. 예를 들어, 배열 행렬의 경우 모양은 (3, 3)이고 배열 번호는 (5)입니다.
크기 배열에 포함 된 요소의 수입니다. 배열 행렬의 경우 9이고 배열 번호의 경우 5입니다.

절차에 배열 전달

배열을 프로 시저에 인수로 전달할 수 있습니다. 다음 예제는 개념을 보여줍니다-

program arrayToProcedure      
implicit none      

   integer, dimension (5) :: myArray  
   integer :: i
   
   call fillArray (myArray)      
   call printArray(myArray)
   
end program arrayToProcedure


subroutine fillArray (a)      
implicit none      

   integer, dimension (5), intent (out) :: a
   
   ! local variables     
   integer :: i     
   do i = 1, 5         
      a(i) = i      
   end do  
   
end subroutine fillArray 


subroutine printArray(a)

   integer, dimension (5) :: a  
   integer::i
   
   do i = 1, 5
      Print *, a(i)
   end do
   
end subroutine printArray

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

1
2
3
4
5

위의 예에서 서브 루틴 fillArray 및 printArray는 차원이 5 인 배열에서만 호출 할 수 있습니다. 그러나 모든 크기의 배열에 사용할 수있는 서브 루틴을 작성하려면 다음 기술을 사용하여 다시 작성할 수 있습니다.

program arrayToProcedure      
implicit  none    

   integer, dimension (10) :: myArray  
   integer :: i
   
   interface 
      subroutine fillArray (a)
         integer, dimension(:), intent (out) :: a 
         integer :: i         
      end subroutine fillArray      

      subroutine printArray (a)
         integer, dimension(:) :: a 
         integer :: i         
      end subroutine printArray   
   end interface 
   
   call fillArray (myArray)      
   call printArray(myArray)
   
end program arrayToProcedure


subroutine fillArray (a)      
implicit none      
   integer,dimension (:), intent (out) :: a      
   
   ! local variables     
   integer :: i, arraySize  
   arraySize = size(a)
   
   do i = 1, arraySize         
      a(i) = i      
   end do  
   
end subroutine fillArray 


subroutine printArray(a)
implicit none

   integer,dimension (:) :: a  
   integer::i, arraySize
   arraySize = size(a)
   
   do i = 1, arraySize
     Print *, a(i)
   end do
   
end subroutine printArray

이 프로그램은 size 배열의 크기를 얻는 함수.

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

1
2
3
4
5
6
7
8
9
10

배열 섹션

지금까지 전체 배열을 언급했지만 Fortran은 단일 명령문을 사용하여 여러 요소 또는 배열의 섹션을 쉽게 참조 할 수있는 방법을 제공합니다.

배열 섹션에 액세스하려면 모든 차원에 대해 섹션의 하한 및 상한과 보폭 (증가)을 제공해야합니다. 이 표기법을subscript triplet:

array ([lower]:[upper][:stride], ...)

하한 및 상한이 언급되지 않은 경우 기본값은 선언 한 범위로 설정되고 스트라이드 값은 기본적으로 1로 설정됩니다.

다음 예제는 개념을 보여줍니다-

program arraySubsection

   real, dimension(10) :: a, b
   integer:: i, asize, bsize
   
   a(1:7) = 5.0 ! a(1) to a(7) assigned 5.0
   a(8:) = 0.0  ! rest are 0.0 
   b(2:10:2) = 3.9
   b(1:9:2) = 2.5
   
   !display
   asize = size(a)
   bsize = size(b)
   
   do i = 1, asize
      Print *, a(i)
   end do
   
   do i = 1, bsize
      Print *, b(i)
   end do
   
end program arraySubsection

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
5.00000000    
0.00000000E+00
0.00000000E+00
0.00000000E+00
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010    
2.50000000    
3.90000010

배열 내장 함수

Fortran 90/95는 몇 가지 고유 절차를 제공합니다. 7 가지 카테고리로 나눌 수 있습니다.

  • 벡터 및 행렬 곱셈

  • Reduction

  • Inquiry

  • Construction

  • Reshape

  • Manipulation

  • Location