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

廣告