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

  • 向量和矩陣乘法

  • 還原

  • 查詢

  • 結構

  • 重塑

  • 處理

  • 位置