Fortran - 数组

  • 简述

    数组可以存储相同类型元素的固定大小的顺序集合。数组用于存储数据的集合,但将数组视为相同类型变量的集合通常更有用。
    所有数组都由连续的内存位置组成。最低地址对应于第一个元素,最高地址对应于最后一个元素。
    数字(1) 数字(2) 数字(3) 数字(4)
    数组可以是一维的(如向量)、二维的(如矩阵),Fortran 允许您创建多达 7 维的数组。
  • 声明数组

    数组声明为dimension属性。
    例如,要声明一个名为 number 的一维数组,该数组由包含 5 个元素的实数组成,您可以编写:
    
    real, dimension(5) :: numbers
    
    数组的各个元素通过指定它们的下标来引用。数组的第一个元素的下标为 1。数组 numbers 包含五个实变量——numbers(1)、numbers(2)、numbers(3)、numbers(4) 和 numbers(5)。
    要创建一个名为矩阵的 5 x 5 二维整数数组,您可以编写 -
    
    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
    
    一维数组元素可以使用简写符号直接赋值,称为数组构造函数,例如,
    
    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    
    
  • 一些数组相关术语

    下表给出了一些与数组相关的术语 -
    学期 意义
    Rank 它是数组具有的维数。例如,对于名为 matrix 的数组,rank 为 2,对于名为 numbers 的数组,rank 为 1。
    Extent 它是沿维度的元素数。例如,数组 numbers 的范围为 5,名为 matrix 的数组在两个维度上的范围为 3。
    Shape 数组的形状是一维整数数组,包含每个维度中元素的数量(范围)。例如,对于数组矩阵,形状为 (3, 3),数组编号为 (5)。
    Size 它是数组包含的元素数。对于数组矩阵,它是 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类。