Fortran陣列


陣列可以儲存相同型別的元件的固定大小的連續集合。陣列是用來儲存資料的集合,但它往往是更加有用認為陣列為相同型別的變數的集合。

所有陣列由連續的儲存單元。最低的地址對應於所述第一元件和所述最高地址的最後一個元素。

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

陣列可以是一維的(如向量),二維(如矩陣),Fortran允許最多建立7維陣列。

宣告陣列

陣列的尺寸屬性宣告。

例如,宣告含有5個元素的實數的一個一維陣列命名號編寫,

real, dimension(5) :: numbers

陣列的各個元素通過指定其下標參照。陣列的第一元件具有一個的下標。陣列數位包含五個實變數- numbers(1), numbers(2), numbers(3), numbers(4), 和numbers(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    

陣列相關某些術語

下表給出了一些陣列相關的術語:

術語 意思
Rank 它的尺寸陣列具有的數目。例如,對於陣列命名矩陣,秩為2,並且對陣列命名號,秩為1。
Extent 它是沿一維中的元素的數量。例如,陣列數位具有範圍5和命名矩陣陣列具有在兩個維度範圍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語言提供了一種簡單的方法來參照幾個元素,或者一個陣列的一部分,使用單條語句。

存取一個陣列片段,需要提供的下限和上限的部分,以及一個跨度(增量),對於所有的尺寸。這種表示法被稱為下標三元組:

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