Fortran数组

2018-12-12 14:24 更新

阵列可以存储相同类型的元件的固定大小的连续集合。数组是用于存储数据的集合,但是认为一个阵列的相同类型的变量的集合是往往更为有用。

所有阵列由连续存储单元。最低的地址对应于第一元件和最高地址的最后一个元素。

数字(1) 号(2) 数(3) 号(4) ...

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

声明数组

数组声明为维度属性。

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

real, dimension(5) :: numbers

阵列的各个元件通过指定其下标被引用。数组的第一元件具有一个的下标。数组编号包含五个实变量 - 值(1),数字(2),数字(3),数字(4),和数字(5)。

要创建一个名为矩阵整数5×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    

某些阵列相关术语

下表给出了一些阵列相关的术语:

术语含义
它是尺寸数组具有的数目。例如,对于在阵列命名矩阵,秩是2,和对于该阵列命名号,等级为1。
程度它是沿着一维的元素的数量。例如,阵列数有程度5和命名矩阵阵列具有在两个维度程度3。
形状阵列的形状是一维整数数组,包含在每一维的元素(的程度)的数量。例如,对于在阵列基质,形状为(3,3)和数组编号是(5)。
尺寸它是一个数组包含的元素数量。为阵列矩阵,它是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

请注意,该程序正在使用尺寸函数获取阵列的大小。

当上述代码被编译和执行时,它产生了以下结果:

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


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号