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