Fortran 数组

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

所有数组都由连续的内存位置组成。最低地址对应于第一个元素,最高地址对应于最后一个元素。

  1. Numbers(1) Numbers(2) Numbers(3) Numbers(4)

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

声明数组

数组是用维度属性声明的。

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

  1. real, dimension(5) :: numbers

通过指定下标来引用数组的各个元素。数组的第一个元素的下标为 1。数组数字包含五个实变量——数字(1)、数字(2)、数字。

要创建一个名为 matrix 的 5 x 5 二维整数数组,你可以写:

  1. integer, dimension (5,5) :: matrix

您还可以声明一个具有明确下限的数组,例如:

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

赋值

您可以为单个成员分配值,例如:

  1. numbers(1) = 2.0

或者你可以使用循环:

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

一维数组元素可以使用称为数组构造函数的简写符号直接赋值,例如,

  1. numbers = (/1.5, 3.2,4.5,0.9,7.2 /)
请注意,括号 "(" 和反斜杠 "/" 之间不允许有空格

实例

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

  1. program arrayProg
  2. real :: numbers(5) !one dimensional integer array
  3. integer :: matrix(3,3), i , j !two dimensional real array
  4. !assigning some values to the array numbers
  5. do i=1,5
  6. numbers(i) = i * 2.0
  7. end do
  8. !display the values
  9. do i = 1, 5
  10. Print *, numbers(i)
  11. end do
  12. !assigning some values to the array matrix
  13. do i=1,3
  14. do j = 1, 3
  15. matrix(i, j) = i+j
  16. end do
  17. end do
  18. !display the values
  19. do i=1,3
  20. do j = 1, 3
  21. Print *, matrix(i,j)
  22. end do
  23. end do
  24. !short hand assignment
  25. numbers = (/1.5, 3.2,4.5,0.9,7.2 /)
  26. !display the values
  27. do i = 1, 5
  28. Print *, numbers(i)
  29. end do
  30. end program arrayProg

结果如下:

  1. 2.00000000
  2. 4.00000000
  3. 6.00000000
  4. 8.00000000
  5. 10.0000000
  6. 2
  7. 3
  8. 4
  9. 3
  10. 4
  11. 5
  12. 4
  13. 5
  14. 6
  15. 1.50000000
  16. 3.20000005
  17. 4.50000000
  18. 0.899999976
  19. 7.19999981

一些与数组相关的术语

下表给出了一些与数组相关的术语:

术语含义
Rank它是数组的维数。例如,对于名为 matrix 的数组,rank 为 2,而对于名为 numbers 的数组,rank 为 1。
Extent它是沿维度的元素数量。例如,数组编号的范围为 5,而名为 matrix 的数组在两个维度上的范围为 3。
Shape数组的形状是一维整数数组,包含每个维度中的元素数量(范围)。例如,对于数组矩阵,形状为(3,3),数组编号为(5)。
Size它是数组包含的元素数。对于数组矩阵,它是 9,对于数组编号,它是 5。

将数组传递给程序

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

  1. program arrayToProcedure
  2. implicit none
  3. integer, dimension (5) :: myArray
  4. integer :: i
  5. call fillArray (myArray)
  6. call printArray(myArray)
  7. end program arrayToProcedure
  8. subroutine fillArray (a)
  9. implicit none
  10. integer, dimension (5), intent (out) :: a
  11. ! local variables
  12. integer :: i
  13. do i = 1, 5
  14. a(i) = i
  15. end do
  16. end subroutine fillArray
  17. subroutine printArray(a)
  18. integer, dimension (5) :: a
  19. integer::i
  20. do i = 1, 5
  21. Print *, a(i)
  22. end do
  23. end subroutine printArray

结果如下:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5

在上面的实例中,子例程 fillArrayprintArray 只能对维度为 5 的数组调用。但是,要编写可用于任何大小数组的子程序,您可以使用以下技术重写它:

  1. program arrayToProcedure
  2. implicit none
  3. integer, dimension (10) :: myArray
  4. integer :: i
  5. interface
  6. subroutine fillArray (a)
  7. integer, dimension(:), intent (out) :: a
  8. integer :: i
  9. end subroutine fillArray
  10. subroutine printArray (a)
  11. integer, dimension(:) :: a
  12. integer :: i
  13. end subroutine printArray
  14. end interface
  15. call fillArray (myArray)
  16. call printArray(myArray)
  17. end program arrayToProcedure
  18. subroutine fillArray (a)
  19. implicit none
  20. integer,dimension (:), intent (out) :: a
  21. ! local variables
  22. integer :: i, arraySize
  23. arraySize = size(a)
  24. do i = 1, arraySize
  25. a(i) = i
  26. end do
  27. end subroutine fillArray
  28. subroutine printArray(a)
  29. implicit none
  30. integer,dimension (:) :: a
  31. integer::i, arraySize
  32. arraySize = size(a)
  33. do i = 1, arraySize
  34. Print *, a(i)
  35. end do
  36. end subroutine printArray
请注意,程序正在使用 size 函数来获取数组的大小。

结果如下:

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10

部分数组

到目前为止,我们已经引用了整个数组,Fortran 提供了一种使用单个语句引用多个元素或数组一部分的简单方法。

要访问部分数组,您需要为所有维度提供该部分的下限和上限,以及增量。这种符号称为下标三元组:

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

当没有提到下限和上限时,它默认为您声明的范围,增量值默认为 1。

以下实例演示了该概念:

  1. program arraySubsection
  2. real, dimension(10) :: a, b
  3. integer:: i, asize, bsize
  4. a(1:7) = 5.0 ! a(1) to a(7) assigned 5.0
  5. a(8:) = 0.0 ! rest are 0.0
  6. b(2:10:2) = 3.9
  7. b(1:9:2) = 2.5
  8. !display
  9. asize = size(a)
  10. bsize = size(b)
  11. do i = 1, asize
  12. Print *, a(i)
  13. end do
  14. do i = 1, bsize
  15. Print *, b(i)
  16. end do
  17. end program arraySubsection

结果如下:

  1. 5.00000000
  2. 5.00000000
  3. 5.00000000
  4. 5.00000000
  5. 5.00000000
  6. 5.00000000
  7. 5.00000000
  8. 0.00000000E+00
  9. 0.00000000E+00
  10. 0.00000000E+00
  11. 2.50000000
  12. 3.90000010
  13. 2.50000000
  14. 3.90000010
  15. 2.50000000
  16. 3.90000010
  17. 2.50000000
  18. 3.90000010
  19. 2.50000000
  20. 3.90000010

数组固有函数

Fortran 90/95 提供了几个内置程序。它们可分为 7 类:

  • Vector 和 matrix multiplication
  • Reduction
  • Inquiry
  • Construction
  • Reshape
  • Manipulation
  • Location

分类导航