当前位置: 首页 > 文档资料 > Fortran 中文教程 >

阵列( Arrays)

优质
小牛编辑
140浏览
2023-12-01

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

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

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

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

声明数组 (Declaring Arrays)

使用dimension属性声明数组。

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

real, dimension(5) :: numbers

通过指定其下标来引用数组的各个元素。 数组的第一个元素的下标为1。 数组编号包含五个实数变量 - 数字(1),数字(2),数字(3),数字(4)和数字(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 /)

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    

一些阵列相关术语

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

术语含义
Rank它是数组具有的维数。 例如,对于名为matrix的数组,rank为2,对于名为numbers的数组,rank为1。
Extent它是维度上的元素数量。 例如,数组编号具有范围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 

Array Intrinsic Functions

Fortran 90/95提供了几种内在程序。 它们可以分为7类。