Fortran - 数组



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

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

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

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

声明数组

数组使用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  

赋值

您可以为各个成员赋值,例如:

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 /)

请注意,括号‘(’和反斜杠‘/’之间不允许有空格

示例

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

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 的数组,秩为 2,对于名为 numbers 的数组,秩为 1。
范围 它是沿一个维度元素的数量。例如,数组 numbers 的范围为 5,名为 matrix 的数组在两个维度上的范围都为 3。
形状 数组的形状是一个一维整数数组,包含每个维度中元素的数量(范围)。例如,对于数组 matrix,形状为 (3, 3),对于数组 numbers,形状为 (5)。
大小 它是数组包含的元素数量。对于数组 matrix,它是 9,对于数组 numbers,它是 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 提供了一种简单的方法来使用单个语句引用多个元素或数组的一部分。

要访问数组节,您需要为所有维度提供节的下界和上界以及步长(增量)。此表示法称为下标三元组:

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 类。

广告