Fortran 数组
数组可以存储固定大小的相同类型元素的顺序集合。数组用于存储数据集合,但将数组视为同一类型的变量集合通常更有用。
所有数组都由连续的内存位置组成。最低地址对应于第一个元素,最高地址对应于最后一个元素。
Numbers(1) Numbers(2) Numbers(3) Numbers(4) …
数组可以是一维(如向量)、二维(如矩阵),Fortran 可以创建多达 7 维的数组。
声明数组
数组是用维度属性声明的。
例如,要声明一个名为 number 的一维数组,其中包含 5 个元素的实数,你可以写:
real, dimension(5) :: numbers
通过指定下标来引用数组的各个元素。数组的第一个元素的下标为 1。数组数字包含五个实变量——数字(1)、数字(2)、数字。
要创建一个名为 matrix 的 5 x 5 二维整数数组,你可以写:
integer, dimension (5,5) :: matrix
您还可以声明一个具有明确下限的数组,例如:
real, dimension(2:6) :: numbersinteger, dimension (-3:2,0:4) :: matrix
赋值
您可以为单个成员分配值,例如:
numbers(1) = 2.0
或者你可以使用循环:
do i =1,5numbers(i) = i * 2.0end do
一维数组元素可以使用称为数组构造函数的简写符号直接赋值,例如,
numbers = (/1.5, 3.2,4.5,0.9,7.2 /)
请注意,括号 "(" 和反斜杠 "/" 之间不允许有空格
实例
以下实例演示了上面讨论的概念。
program arrayProgreal :: numbers(5) !one dimensional integer arrayinteger :: matrix(3,3), i , j !two dimensional real array!assigning some values to the array numbersdo i=1,5numbers(i) = i * 2.0end do!display the valuesdo i = 1, 5Print *, numbers(i)end do!assigning some values to the array matrixdo i=1,3do j = 1, 3matrix(i, j) = i+jend doend do!display the valuesdo i=1,3do j = 1, 3Print *, matrix(i,j)end doend do!short hand assignmentnumbers = (/1.5, 3.2,4.5,0.9,7.2 /)!display the valuesdo i = 1, 5Print *, numbers(i)end doend program arrayProg
结果如下:
2.000000004.000000006.000000008.0000000010.00000002343454561.500000003.200000054.500000000.8999999767.19999981
一些与数组相关的术语
下表给出了一些与数组相关的术语:
| 术语 | 含义 |
|---|---|
| Rank | 它是数组的维数。例如,对于名为 matrix 的数组,rank 为 2,而对于名为 numbers 的数组,rank 为 1。 |
| Extent | 它是沿维度的元素数量。例如,数组编号的范围为 5,而名为 matrix 的数组在两个维度上的范围为 3。 |
| Shape | 数组的形状是一维整数数组,包含每个维度中的元素数量(范围)。例如,对于数组矩阵,形状为(3,3),数组编号为(5)。 |
| Size | 它是数组包含的元素数。对于数组矩阵,它是 9,对于数组编号,它是 5。 |
将数组传递给程序
您可以将数组作为参数传递给过程。以下实例演示了该概念:
program arrayToProcedureimplicit noneinteger, dimension (5) :: myArrayinteger :: icall fillArray (myArray)call printArray(myArray)end program arrayToProceduresubroutine fillArray (a)implicit noneinteger, dimension (5), intent (out) :: a! local variablesinteger :: ido i = 1, 5a(i) = iend doend subroutine fillArraysubroutine printArray(a)integer, dimension (5) :: ainteger::ido i = 1, 5Print *, a(i)end doend subroutine printArray
结果如下:
12345
在上面的实例中,子例程 fillArray 和 printArray 只能对维度为 5 的数组调用。但是,要编写可用于任何大小数组的子程序,您可以使用以下技术重写它:
program arrayToProcedureimplicit noneinteger, dimension (10) :: myArrayinteger :: iinterfacesubroutine fillArray (a)integer, dimension(:), intent (out) :: ainteger :: iend subroutine fillArraysubroutine printArray (a)integer, dimension(:) :: ainteger :: iend subroutine printArrayend interfacecall fillArray (myArray)call printArray(myArray)end program arrayToProceduresubroutine fillArray (a)implicit noneinteger,dimension (:), intent (out) :: a! local variablesinteger :: i, arraySizearraySize = size(a)do i = 1, arraySizea(i) = iend doend subroutine fillArraysubroutine printArray(a)implicit noneinteger,dimension (:) :: ainteger::i, arraySizearraySize = size(a)do i = 1, arraySizePrint *, a(i)end doend subroutine printArray
请注意,程序正在使用 size 函数来获取数组的大小。
结果如下:
12345678910
部分数组
到目前为止,我们已经引用了整个数组,Fortran 提供了一种使用单个语句引用多个元素或数组一部分的简单方法。
要访问部分数组,您需要为所有维度提供该部分的下限和上限,以及增量。这种符号称为下标三元组:
array ([lower]:[upper][:stride], ...)
当没有提到下限和上限时,它默认为您声明的范围,增量值默认为 1。
以下实例演示了该概念:
program arraySubsectionreal, dimension(10) :: a, binteger:: i, asize, bsizea(1:7) = 5.0 ! a(1) to a(7) assigned 5.0a(8:) = 0.0 ! rest are 0.0b(2:10:2) = 3.9b(1:9:2) = 2.5!displayasize = size(a)bsize = size(b)do i = 1, asizePrint *, a(i)end dodo i = 1, bsizePrint *, b(i)end doend program arraySubsection
结果如下:
5.000000005.000000005.000000005.000000005.000000005.000000005.000000000.00000000E+000.00000000E+000.00000000E+002.500000003.900000102.500000003.900000102.500000003.900000102.500000003.900000102.500000003.90000010
数组固有函数
Fortran 90/95 提供了几个内置程序。它们可分为 7 类:
- Vector 和 matrix multiplication
- Reduction
- Inquiry
- Construction
- Reshape
- Manipulation
- Location