Fortran 简明教程

Fortran - Arrays

数组可以存储同一类型的固定大小的连续元素集合。数组用于存储数据集合,但将数组视为同类型变量的集合通常更有用。

所有阵列都包含连续的内存位置。最低地址对应于第一个元素,而最高地址对应于最后一个元素。

Numbers(1)

Numbers(2)

Numbers(3)

Numbers(4)

数组可以是一维的(如向量)、二维的(如矩阵),Fortran 允许你创建最多 7 维数组。

Declaring Arrays

使用 dimension 特性声明数组。

例如,要声明一个名为 number 的一维数组,其中包含 5 个元素的实数,则需要编写:

real, dimension(5) :: numbers

通过指定下标来引用数组的各个元素。数组的第一个元素的下标为 1。数组 numbers 包含五个实变量:numbers(1)numbers(2)numbers(3)numbers(4)numbers(5)

要创建一个名为 matrix 的 5 x 5 二维整数数组,请编写:

integer, dimension (5,5) :: matrix

也可以使用一些明确的下限声明一个数组,例如:

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

Assigning Values

可以针对各个成员分配值,例如:

numbers(1) = 2.0

或者可以使用循环:

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

可以采用称为数组构造器的简写符号直接为一维数组元素分配值,例如:

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 ‘/’

Example

以下示例展示了上面讨论的概念。

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

下表提供了一些与数组相关的术语:

Term

Meaning

Rank

数组的维数。例如,对于名为 matrix 的数组,秩为 2,对于名为 numbers 的数组,秩为 1。

Extent

某个维度的元素数目。例如,numbers 数组的延伸为 5,名为 matrix 的数组在两个维度上的延伸为 3。

Shape

数组的形状是一维整数数组,包含每个维度中的元素数目(延伸)。例如,对于数组 matrix,形状为 (3, 3),对于 numbers 数组是 (5)。

Size

数组包含的元素数目。对于 matrix 数组,该值为 9,对于 numbers 数组,该值为 5。

Passing Arrays to Procedures

可以将数组作为参数传递给过程。以下示例演示了该概念:

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

Array Sections

到目前为止,我们只参考了整个数组,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

Array Intrinsic Functions

Fortran 90/95 提供了若干内在过程。它们可分为 7 类。