版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第9章 Fortran中的數(shù)組,數(shù)組是Fortran語言中功能最為強大、運用最為靈活的一種數(shù)據(jù)結構。數(shù)組(ARRAY)在科學和工程計算中通常用來表示矩陣和向量。同一般的變量聲明相比,數(shù)組能夠同時保存多個數(shù)據(jù)。它是一種使用大規(guī)模數(shù)據(jù)的方法。配合Fortran語言中的數(shù)組操作,可用于對大量不同的數(shù)據(jù)進行處理。在存儲結構上,數(shù)組占用一片連續(xù)的存儲單元。程序中通過數(shù)組索引來對數(shù)組元素、片斷進行操作。,9.1 數(shù)組的定義,要在程序中使用數(shù)組,
2、需要首先在變量聲明中進行數(shù)組定義。數(shù)組定義規(guī)定了數(shù)組的維數(shù)和大小,以及數(shù)組所能保存的數(shù)據(jù)類型。在程序中,通過數(shù)組引用來對數(shù)組、數(shù)組元素或者數(shù)組片斷進行操作。數(shù)組是類型相同、種別一致的一組變量的有序集合。它可以是整型、實型、雙精度型、復型、邏輯型、字符型以及自定義類型等中的任意一種。組成數(shù)組的每一個變量被稱為數(shù)組元素,并由唯一的下標來進行標識。數(shù)組定義說明了數(shù)組所能保存的數(shù)據(jù)類型、數(shù)組的維數(shù)、維的范圍和數(shù)組的大小。本節(jié)主要介紹Fortr
3、an中數(shù)組定義的幾種方式。,9.1.1 定義形式一,第一種數(shù)組定義形式的語法格式如下所示。類型說明 [::] 數(shù)組名([下標下界:]下標上界[,…])[,…]該定義形式通過類型說明來顯式聲明數(shù)組的數(shù)據(jù)類型,并通過下標下界和下標上界來規(guī)定數(shù)組中某一維的范圍。下標下界和下標上界共同組成了維說明符。當維說明符省略下標下界時,默認所在維的下標從1開始。如下代碼都是合法的數(shù)組定義。REAL :: A(1:2,2:4)INTEGER B(
4、10),9.1.2 定義形式二,第二種數(shù)組定義形式的語法格式如下所示。DIMENSION [::] 數(shù)組名([下標下界:]下標上界[,…])[,…][類型說明 [::] 數(shù)組名[,…]]該定義形式通過DIMENSION語句來進行數(shù)組的定義,通過下標下界和下標上界來規(guī)定數(shù)組中某一維的范圍。在第二行通過類型說明來顯式聲明數(shù)組的數(shù)據(jù)類型。當省略類型說明時,采用默認的“I-N”規(guī)則來對數(shù)組的數(shù)據(jù)類型進行定義。如下代碼合法的對數(shù)組進行了定
5、義。DIMENSION :: A(10), B(2:11)INTEGER :: A,9.1.3 定義形式三,第三種數(shù)組定義形式的語法格式如下所示。DIMENSION([下標下界:]下標上界[,…]) [::] 數(shù)組名[,…][類型說明 [::] 數(shù)組名[,…]]該定義形式通過DIMENSION語句直接說明了數(shù)組的維數(shù)和維的范圍。這種形式定義的數(shù)組全部具有相同的維數(shù)和大小。如下代碼表示了如何采用上述形式進行數(shù)組的定義。DIM
6、ENSION(10, 4:10) :: A, B, NINTEGER :: AREAL(8) :: N,9.1.4 定義形式四,第四種數(shù)組定義形式的語法格式如下所示。[類型說明,]DIMENSION [::] 數(shù)組名([下標下界:]下標上界[,…])[,…][類型說明,]DIMENSION([下標下界:]下標上界[,…]) [::] 數(shù)組名[,…]該定義形式可以說是前三種定義形式的綜合形式。通過在DIMENSION語句前引入
7、類型說明來顯式的說明數(shù)組的數(shù)據(jù)類型。下列代碼演示了此種形式的數(shù)組定義。REAL, DIMENSION :: I(10), M(10,5)INTEGER, DIMENSION(10) :: A, C,9.1.5 數(shù)組定義的特點,上述數(shù)組定義的形式中,中括弧內(nèi)的部分可有可無。數(shù)組定義語句必須出現(xiàn)在所有可執(zhí)行語句之前。除了上述基本的定義形式外,在Fortran77中可以使用COMMON語句,在Fortran90中可以用POINTER語句
8、、ALLOCATABLE語句等對數(shù)組定義進行加強。在前面所述的四種定義形式中,定義形式因簡潔直觀而常見于實際使用中。此外,如下問題是在實際編程中應該注意的。在前面所述的數(shù)組定義中,I(10)、M(10,5)、A、C等稱為數(shù)組說明符。在同一個說明語句中有多個數(shù)組說明符時,用逗號進行分隔。數(shù)組說明符中的I、M、A、C等是數(shù)組名,其取名規(guī)則與變量相同并且不應與程序中的其他變量同名。在同一個程序單元中,一個數(shù)組名只允許定義一次,不能重復定
9、義。例如下面的數(shù)組定義是錯誤的。INTEGER :: A(10), A(10,20),9.2 數(shù)組的引用方式,數(shù)組經(jīng)過定義之后,就可以在程序中使用了。在Fortran77標準中,數(shù)組只允許在輸入輸出語句中進行整體操作。在其他場合,只能對數(shù)組的元素通過下標索引的方式逐個進行操作。到了Fortran90標準,這一限制被大大放寬了。數(shù)組除了能夠進行整體操作以外,還能對數(shù)組中的片斷和數(shù)組的整體進行操作。這進一步增強了Fortran語言在數(shù)值
10、處理方面的能力。Fortran中數(shù)組的引用方式可以概括為以下幾種:,9.2.1 引用數(shù)組元素,引用數(shù)組元素的語法格式如下所示。數(shù)組名(下標,……)這種引用方式通過下標索引來對數(shù)組中的每一個元素進行操作。它是Fortran中最為傳統(tǒng)的一種引用方式。采用這種方式進行引用時,下標的值不能超出數(shù)組定義時的下標上下界。目前市面上絕大部分的Fortran編譯器都會提供在編譯時進行數(shù)組下標越界檢查的功能。而其他計算機語言的編譯器,如C/C++編
11、譯器往往不提供這樣的功能,需要程序員自行檢查代碼中是否存在數(shù)組越界的行為。,9.2.2 引用數(shù)組整體,引用數(shù)組整體的語法格式如下所示。數(shù)組名這種引用方式通過數(shù)組名來對數(shù)組進行整體操作。這種引用方式是Fortan90中新增的,大大提高了程序編寫的靈活性和簡單性。我們對前一個例程TEST0901進行修改,通過整體引用來對數(shù)組進行賦值。TEST0902.F90
12、 ! 引用數(shù)組整體的范例PROGRAM TEST0902 IMPLICIT NONE! 變量定義 REAL :: A, B(5,5) READ(*, *)A! 數(shù)組整體引用 B = AEND PROGRAM TEST0902,9.2.3 引用數(shù)組片斷,引用數(shù)組片斷的語法格式如下所示。數(shù)組名(下標范圍,……)在
13、這種引用方式中,數(shù)組中的元素可以用過數(shù)組片斷來進行引用。當需要給數(shù)組中的不同片斷的元素賦予不同數(shù)值時,這種引用方式非常方便。來看下面一個例子。TEST0903.F90 ! 引用數(shù)組片斷的范例PROGRAM TEST0903 IMPLICIT NONE! 變
14、量定義 REAL :: A1, A2,A3,A4,A5,B(5,5) READ(*, *)A1,A2,A3,A4,A5! 數(shù)組片斷的引用 B(1,1:5) = A1 B(2,1:5) = A2 B(3,1:5) = A3 B(4,1:5) = A4 B(5,1:5) = A5END PROGRAM TEST0903,9.3 數(shù)組的存儲,盡管在Fortran語言中,允許程序員聲明維數(shù)高達7維的數(shù)組來使用
15、,但是計算機的內(nèi)存卻只是一維的。所以不管聲明的數(shù)組有幾維,數(shù)組在內(nèi)存中都是以一維的方式來進行存儲。數(shù)組中元素在計算機內(nèi)的存儲順序同時也被用作輸入/輸出時確定其中的元素數(shù)據(jù)在進行操作時的先后順序。,9.3.1 數(shù)組的存儲結構,Fortran中,一維數(shù)組在計算機內(nèi)存中的存儲是最簡單的一種情況。在邏輯結構上,一維數(shù)組可以看成是由一系列數(shù)組元素組成的一個單列數(shù)據(jù)表。數(shù)組中每個元素的下標就確定了此元素在數(shù)據(jù)表中的位置。下標越小,在數(shù)據(jù)表中的位置
16、就越靠前。在計算機內(nèi)存中,一維數(shù)組占據(jù)一片連續(xù)的存儲單元,單個元素在內(nèi)存中的位置就是其邏輯結構中的位置。,9.3.2 數(shù)組存儲結構的應用,目前的計算機硬件體系結構決定了在讀取大批量數(shù)據(jù)時,如果這一批數(shù)據(jù)都位于臨近的內(nèi)存中時,讀取操作會執(zhí)行得較快。在編寫程序時,如果想要提高執(zhí)行效率,就應該對數(shù)據(jù)在計算中的保存方式和讀取方式有一定的了解。只有了解了數(shù)據(jù)在計算內(nèi)的存儲結構,才能在編寫程序的時候做到有的放矢。這樣編寫出來的程序在數(shù)據(jù)的存取效率
17、上才能較高。需要注意的是,盡管Fortran中的數(shù)組是按“列元素優(yōu)先”的規(guī)則進行存儲的,但是C語言中的數(shù)組則是按照“行元素優(yōu)先”的原則進行存儲,并且C語言中數(shù)組的下標下界固定是從0開始的。在編寫相關的程序時,應該注意到這一差別。Fortran語言中,使用DO循環(huán)進行高效率數(shù)組操作的代碼寫法可能在C語言中恰恰是最低效的。比如下面的程序段在Fortran中能夠得到較好的執(zhí)行效率:DO J = 1, 5 DO I = 1,3
18、Sum = Sum + A(I, J) ENDDO,9.4 數(shù)組的類型,根據(jù)數(shù)組在定義時的特征,比如數(shù)組的秩、數(shù)組的形狀和每一維的大小,可以將數(shù)組劃分為好幾種類型。這些不同類型的數(shù)組在程序單元中如何使用?在哪些程序單元中使用?有什么特點?本節(jié)將針對這些問題進行逐一介紹。,9.4.1 顯形數(shù)組,顯形(Explicit-shape)數(shù)組是Fortran中最簡單、最容易理解的一種數(shù)組類型。顧名思義,這種類型的數(shù)組在定義階段就通過數(shù)組定
19、義語句明確的規(guī)定了所有特征,比如數(shù)組的秩、數(shù)組的維數(shù)、每一維的長度和上下界。通過這種方式定義的數(shù)組具有確定的形狀和大小,在程序運行過程中不允許再對數(shù)組的任何特征進行改變。需要注意的是,在顯形數(shù)組的維說明中,還允許使用整型變量或整型表達式來定義維的上下界。這涉及到兩種特殊的顯形數(shù)組,會在隨后的小節(jié)中進行介紹。,9.4.2 特殊的顯形數(shù)組——自動數(shù)組,自動數(shù)組(Automatic Array)是顯形數(shù)組的一種特殊形式,這種形式的顯形數(shù)組只
20、能是過程中的局部變量。使用自動數(shù)組時最好在過程中加以聲明,并且數(shù)組中至少有一維的上下界是不確定的整型變量或整型表達式。在調(diào)用過程時,自動數(shù)組中不確定的上下界首先通過整型變量或整型表達式求出。這樣,整型變量或整型表達式的值在過程中發(fā)生的變化,就不會影響到數(shù)組中的上下界。,9.4.3 特殊的顯形數(shù)組——可調(diào)數(shù)組,可調(diào)數(shù)組(Adjustable Array)也是顯形數(shù)組的一種特殊形式,這種類型的顯形數(shù)組只能是過程中的一個啞元??烧{(diào)數(shù)組中
21、至少有一維的上下界不是常數(shù),這個維的上下界只有當過程被調(diào)用時才能最終確定。并且該維的上下界表達式中的整型變量可以是通過過程傳遞的啞元,也可以是通過COMMON語句中傳遞的整型常量或變量。和自動數(shù)組類似,過程內(nèi)部對維界參數(shù)的賦值不會改變數(shù)組中該維的上下界。,9.4.4 顯形數(shù)組的不足,顯形數(shù)組是數(shù)組應用的基礎,其中的自動數(shù)組和可調(diào)數(shù)組能夠提供非常靈活的數(shù)組應用。比如自動數(shù)組在處理具體數(shù)量未知的大筆數(shù)組數(shù)據(jù)時,能夠提供相當好的解決方案。但
22、是有一點需要注意,由于自動數(shù)組和可調(diào)數(shù)組都是通過過程來使用的,因此過程的一些特點也會影響到這兩種數(shù)組的使用。比如使用自動數(shù)組時,過程在計算機中的堆棧限制會妨礙可使用的自動數(shù)組的大小。這種情況可以通過在執(zhí)行TEST0906時,將變量I設置成一個大數(shù)(比如100000)來觀察到,此時屏幕上的打印信息如下:Input the value of I:100000forrtl: severe (170): Program Exception
23、 - stack overflowImage PC Routine Line SourceTEST0307.exe 004011DB Unknown Unknown UnknownTEST0307.exe 0040110A Unknown Unknown Unknown
24、TEST0307.exe 0043FCD9 Unknown Unknown UnknownTEST0307.exe 00428FF9 Unknown Unknown Unknownkernel32.dll 7C816FD7 Unknown Unknown Unknown Incremen
25、tally linked image--PC correlation disabled.,9.4.5 假定形狀數(shù)組,假定形狀(Assumed-shape)數(shù)組是一種在過程中使用的特殊類型數(shù)組,這種類型的數(shù)組借助過程中的啞元從實際傳遞到過程中的數(shù)組獲得自身的形狀參數(shù)。假定形狀數(shù)組的秩由數(shù)組定義中冒號“:”的個數(shù)來決定,其一般形式如下:類型聲明 數(shù)組名([下界]:[,[下界]:]...)如果在定義時不指定維的下界值,則默認這一維的下界
26、值為1。維的上界值等于過程調(diào)用中實參數(shù)組對應維的長度加上定義中規(guī)定的下界值再減去1。假定形狀數(shù)組與可調(diào)數(shù)組的區(qū)別非常細微:可調(diào)數(shù)組是一種顯型數(shù)組,在定義時必須指定維的上界(盡管這個上界可以是變量或表達式);而假定形狀數(shù)組在定義時是不能指定維的上界的。來看這樣一個代碼段:SUBROUTINE ASSUMEDSHAPE(A) REAL A(:,:,:) ……END SUBROUTINE ASSUMEDSHAPE,9.4.6 假
27、定大小數(shù)組,假定大?。ˋssumed-size)數(shù)組也是一種在過程中使用的特殊類型數(shù)組的啞元,這種類型的數(shù)組借助過程中的啞元從實際傳遞到過程中的數(shù)組來獲得自身的大小。1.假定大小數(shù)組的定義:假定大小數(shù)組在聲明時,除了最后一維的上界以外,其它所有特征(比如數(shù)組的秩、維的長度和維的上下界等)都必須明確指定。聲明假定大小數(shù)組的一般形式如下:類型說明 數(shù)組名([維說明符,][維說明符,]...[下界:]*)2.假定大小數(shù)組的應用,9.4.
28、7 延遲形狀數(shù)組,延遲形狀(Deferred-shape)數(shù)組是Fortran 90/95標準中才開始引入的特殊類型數(shù)組,這種類型的數(shù)組在聲明時并不制定數(shù)組的維界,具體的維界需要在程序執(zhí)行過程中才能確定。延遲形狀數(shù)組的典型代表就是數(shù)組指針和可分配數(shù)組。聲明延遲形狀數(shù)組時,數(shù)組的秩由冒號“:”來確定,但每一維的長度是未知的。數(shù)組的維界和形狀在程序執(zhí)行過程中給延遲形狀數(shù)組分配存儲空間之后才能決定。可分配數(shù)組可以通過ALLOCATABLE
29、語句、DIMENSION語句、TARGET語句或在類型聲明中使用ALLOCATABLE屬性來進行說明;而數(shù)組指針則由POINT語句或在類型聲明中使用POINTER屬性來進行說明。數(shù)組指針的邊界和形狀通過指針賦值語句指向目標之后進行確定,或者通過ALLOCATE語句直接進行指針的空間分配;而可分配數(shù)組的邊界和形狀則只能通過ALLOCATABEL語句來進行指定。,9.5 數(shù)組的動態(tài)分配,所謂數(shù)組的動態(tài)分配就是指數(shù)組的大小、形狀等特征是在程
30、序運行中動態(tài)的確定,而不是在程序聲明段就確定好了的。數(shù)組的動態(tài)分配能給程序設計提供更大的靈活性。本節(jié)就將介紹有關數(shù)組動態(tài)分配的有關內(nèi)容。,9.5.1 自動數(shù)組與可分配數(shù)組,從存儲狀態(tài)來說,數(shù)組可以劃分為靜態(tài)數(shù)組和動態(tài)數(shù)組兩種。如果數(shù)組是靜態(tài)的,那么在編譯階段就會為數(shù)組分配好固定的儲存空間,這些存儲空間在程序執(zhí)行過程中會一直保留的,直到程序退出時才會被釋放。程序運行過程中,靜態(tài)數(shù)組的大小不會發(fā)生改變。靜態(tài)數(shù)組的一個主要缺陷在于,即使數(shù)組
31、已經(jīng)不再使用,仍然會占據(jù)分配給它的內(nèi)存空間,這就造成了系統(tǒng)資源的浪費。如果計算機的內(nèi)存資源有限,這會使得其他程序的可用內(nèi)存資源減少。最嚴重的情況是可用內(nèi)存資源不足,這將導致程序執(zhí)行錯誤。,9.5.2 可分配數(shù)組的分配與釋放,在實際的程序中,往往會碰到這樣的問題:一些數(shù)組的大小在程序執(zhí)行之前并不知道具體的大小,只能在程序運行的過程中才能確定。那么如何解決這類問題呢?一個辦法就是為程序聲明一個足夠大的數(shù)組,大到將數(shù)據(jù)一股腦全裝進去后還有富
32、裕。但是這又會造成存儲空間的浪費,在過去386、486的時代,浪費寶貴的內(nèi)存無疑就是犯罪。另一種辦法就是前面提到過的自動數(shù)組,這需要用到過程的概念和良好的程序設計結構。如果碰到有些數(shù)組需要作為全局變量在不同的過程中進行處理的情況,就只好采用開一個大數(shù)組的辦法來解決。為了更有效的利用計算機中的內(nèi)存,F(xiàn)ortran 90/95標準中正是引入了可分配數(shù)組的概念。通過ALLOCATE語句可以動態(tài)的創(chuàng)建可分配數(shù)組,使內(nèi)存和對象可以在程序開始運行
33、之后才建立起相互聯(lián)系。,9.5.3 可分配數(shù)組的應用實例,下面的代碼實例演示了可分配數(shù)組在程序中的應用,以加深對可分配數(shù)組的理解。(詳細內(nèi)容請參照本書),9.6 數(shù)組賦值,當數(shù)組配置好內(nèi)存空間后,可以通過賦值語句或是數(shù)組構造器為數(shù)組中的元素進行賦值。Fortran語言中,數(shù)組的賦值可以通過賦值語句、DATA語句和數(shù)組構造器這三種手段來進行。,9.6.1 數(shù)組賦值語句,首先介紹數(shù)組賦值語句。數(shù)組賦值語句是Fortran 90/95
34、標準中新增加的數(shù)組賦值手段。數(shù)組賦值語句的基本形式為:數(shù)組對象 = value其中,數(shù)組對象代表數(shù)組名或數(shù)組片段,value表示數(shù)組表達式或者標量。當value為數(shù)組表達式時,必須和數(shù)組對象具有相同的形狀(即維數(shù)相同、每維長度相同,但上下界可以不同);當value大小為0或者是長度為0的字符型變量時,則沒有值賦給數(shù)組對象;當value為標量時,會把value處理成與數(shù)組對象相同的形狀,此時數(shù)組對象的每個元素均等于標量value的值。
35、數(shù)組表達式中允許使用“+”、“-”、“*”、“/”、“**”等內(nèi)部算術操作符。,9.6.2 數(shù)組構造器,數(shù)組構造器是由括號和斜線對之間的一系列數(shù)值組成,其一般形式為:數(shù)組名 = (/取值列表/)其中,取值列表可以是標量,隱式DO循環(huán)或者任意秩的數(shù)組。取值列表中所有數(shù)值的類型都應該相同,數(shù)值之間以逗號分隔。如果取值列表中出現(xiàn)了數(shù)組,則它的值是按“列元素優(yōu)先”的規(guī)則來賦給目標數(shù)組變量。數(shù)組構造器的標識“(/”和“/)”在書寫時要注意,
36、括弧和撇號之間不能有空格。下面來看一些實例。MN = (/1, 3, 5, 7, 9/) ! 標量表示AB = (/B(2,1:5),B(3:7,7:9)/) ! 數(shù)組表示CC = (/(I, I=1,4)/)! 隱DO循環(huán)DE = (/10,A(2:7),(I,I=1,4),7/)! 混合表示,9.6.3 DATA語句,DATA語句從Fortran 77時代開始就已經(jīng)用于數(shù)組的賦值,
37、只適用于數(shù)組初值的設置。本小節(jié)將介紹DATA語句進行數(shù)組賦值的基本用法。1.DATA語句賦值的特點同前面所述的兩種數(shù)組賦值語句不同的是,DATA語句允許直接對數(shù)組進行部分賦值,但此時編譯器一般會給出警告信息,提示賦值數(shù)量不足。也就是說,在DATA語句中可以不要求數(shù)值的數(shù)量必須與被賦值數(shù)組的數(shù)組元素個數(shù)相同。被賦值數(shù)組中的數(shù)組元素按照“列元素優(yōu)先”的原則“搶奪”數(shù)據(jù)段中的數(shù)據(jù),一句話:先到先得。 2.DATA語句的特殊性DATA語
38、句是一種特殊的說明語句,與普通的說明語句有很大的不同。普通的說明語句必須放在說明段中,也就是必須放在可執(zhí)行語句之前。但是DATA語句允許出現(xiàn)在程序單元結束語句END前的任意位置。由于DATA語句是在編譯期間就會執(zhí)行的語句,因此,不管程序中出現(xiàn)多少條DATA語句,也不管DATA語句出現(xiàn)在什么位置,同一個變量在程序執(zhí)行前只允許有一個值。這個值以出現(xiàn)在程序中的最后一條DATA語句的賦值為準。這就是為什么在本小節(jié)開始說DATA只適用于設置初值的
39、緣故。,9.7 數(shù)組的輸入輸出,在Fortran語言中,數(shù)組的操作方式非常豐富。其中,對數(shù)組的輸入/輸出操作即可以使用隱式DO循環(huán)來指定要進行輸入/輸出的每一維數(shù)組元素的起始位置、終止位置和步長增量,也可以直接給出要進行輸入/輸出的數(shù)組名、數(shù)組元素以及數(shù)組片段。下面將分別進行講解。,9.7.1 一維數(shù)組的輸入輸出,一維數(shù)組的輸入/輸出操作是數(shù)組操作中最簡單的情況,也是二維、三維乃至更高維數(shù)組輸入/輸出操作的基礎。只要掌握了一維數(shù)組的
40、輸入/輸出操作方法,其他高維數(shù)組的輸入/輸出操作就很容易理解。由于一維數(shù)組在計算機內(nèi)存中進行存儲時是線性排列的,因此輸入/輸出操作時,數(shù)據(jù)是按照數(shù)組給出的下標值依次進行輸入/輸出的。在對一維數(shù)組進行輸入/輸出操作時,即可以將整個數(shù)組作為輸入/輸出操作的對象,也可以只輸入/輸出數(shù)組中的一個元素、一個片斷。,9.7.2 二維數(shù)組的輸入輸出,二維數(shù)組輸入/輸出操作的基礎就是一維數(shù)組的輸入/輸出操作,兩者沒有本質(zhì)上的不同。數(shù)組元素輸入/輸出
41、的順序是按照前面提到過的數(shù)組在計算機內(nèi)存中的存儲順序來進行的。由于Fortran語言中數(shù)組的存放順序采用“列元素優(yōu)先”的原則,因此在對二維數(shù)組進行輸入操作是,首先輸入的數(shù)據(jù)被數(shù)組中的第一列元素接收。比如要對一個的數(shù)組Array進行輸入,輸入語句“READ*,A”按下列順序?qū)?shù)據(jù)讀入給數(shù)組中的每個元素:Array(1,1)>Array(2,1)>Array(3,1)>Array(1,2)>Array(2,2)&
42、gt;Array(3,2)>Array(1,3)>Array(2,3)>Array(3,3)按“列元素優(yōu)先”的方式進行存貯的做法與數(shù)學上按行進行處理的習慣不太不一致,在進行輸入操作應該引起足夠的注意。給數(shù)組中各元素賦值時,應該先輸入第一列元素的值,再輸入第二列、第三列、……上元素的值,這樣才能確保計算機內(nèi)接收到的矩陣是正確的。,9.7.3 其它高維數(shù)組的輸入輸出,更高維數(shù)組的輸入輸出方式也是以一維數(shù)組的輸入輸出為基
43、礎的。在輸入時,總是最低維上的下標值變化最快。例如一個2X2X2的三維數(shù)組Mx,在使用數(shù)組名進行系統(tǒng)默認的輸入操作時,讀入數(shù)據(jù)的先后次序如下:Mx(1,1,1)>Mx(2,1,1)>Mx(1,2,1)>Mx(2,2,1)>Mx(1,1,2)>Mx(2,1,2)>Mx(1,2,2)>Mx(2,2,2)如果想要實現(xiàn)以“行元素優(yōu)先”為規(guī)則進行輸入,則需要在輸入語句中交換隱式DO循環(huán)內(nèi)外層循環(huán)變量的
44、方法來實現(xiàn)。比如要實現(xiàn)數(shù)組Mx的“行元素優(yōu)先”原則輸入,則可以使用下面的輸入語句來實現(xiàn):READ *, (((Array(I, J, K), K=1,2), J=1,2), I=1,2),9.8 數(shù)組的運算,數(shù)組之間的運算是Fortran語言獨步數(shù)值計算領域的一大絕活。當其他計算機語言還在使用DO循環(huán)、for循環(huán)或是其他形式的循環(huán)來為數(shù)組賦初值時,F(xiàn)ortran早已通過數(shù)組的整體賦值完成了這一工作,并開始了對數(shù)據(jù)的處理。當其他計算機
45、語言好容易把一大票數(shù)據(jù)讀入到計算機之后,又開始用DO循環(huán)、for循環(huán)或是其他形式的循環(huán)將剛讀入的兩個巨型數(shù)組相加、相減以得到結果時,F(xiàn)ortran早已通過數(shù)組的算術運算完成了這些工作開始輸出結果了。數(shù)組間的運算是Fortran 90/95標準中有利于數(shù)值計算的新手段。在Fortran 77時代,數(shù)組間的運算也只能通過循環(huán)的手段來實現(xiàn)。在新的Fortran標準中,允許把整個數(shù)組或數(shù)組的一部分(即數(shù)組片段)作為一個獨立的對象進行相關的運算
46、。前提是進行數(shù)組運算的兩個獨立對象應該是大小相同、形狀一致。在Fortran語言中,允許將數(shù)組或數(shù)組片斷作為運算對象的運算符包括:所有的算術運算符(包括“+”、“-”、“*”、“/”、“**”五種)所有的邏輯運算符(包括“.AND.”、“.OR.”、“.NOT.”、“.NEQV.”、“.EQV. ”五種)所有的關系運算符(包括“.LT.()”、“.GE.(>=)”六種),9.8.1 算術運算,在數(shù)組的算術運算表達
47、式中,允許出現(xiàn)的對象包括數(shù)組、數(shù)組片斷、數(shù)組元素和標量。不同對象之間的運算有自身的特定規(guī)則和行為模式。1.算術運算的規(guī)則如果算術運算符兩側的運算對象都是數(shù)組或數(shù)組片斷,則要求兩個數(shù)組或數(shù)組片斷應該是大小相同、形狀一致的。運算在兩個數(shù)組或數(shù)組片斷對應位置上的數(shù)組元素間進行,保存結果的數(shù)組或數(shù)組片斷也應該和運算對象大小相同、形狀一致。 2.算術運算的行為模式,9.8.2 邏輯運算,在數(shù)組的邏輯運算表達式中,允許出現(xiàn)的對象包括數(shù)組、數(shù)
48、組片斷、數(shù)組元素和標量。如果邏輯運算符兩側的運算對象都是數(shù)組或數(shù)組片斷,則要求兩個數(shù)組或數(shù)組片斷應該是大小相同、形狀一致的。運算在兩個數(shù)組或數(shù)組片斷對應位置上的數(shù)組元素間進行,保存結果的數(shù)組或數(shù)組片斷也應該和運算對象大小相同、形狀一致。如果邏輯運算符兩側的運算對象一個是數(shù)組或數(shù)組片斷,另一個是數(shù)組元素或標量,則運算在數(shù)組或數(shù)組片斷與數(shù)組元素或標量之間進行。保存結果的數(shù)組或數(shù)組片斷應該與參與運算的數(shù)組或數(shù)組片斷大小相同、形狀一致。,9
49、.8.3 關系運算,數(shù)組之間的關系運算在運算對象、運算規(guī)律上與數(shù)組的算術運算和邏輯運算沒什么兩樣。假設數(shù)組A用于保存運算結果,數(shù)組B是雙目關系運算中的一個運算對象,C是另一個運算對象(可以是數(shù)組,也可以是可用于關系運算的其他標量),符號“&”表示任意一種關系運算符。則語句“A=B&C”類似于執(zhí)行表所示的操作:,數(shù)組的關系運算操作,9.9 常用內(nèi)在函數(shù),Fortran語言中的內(nèi)在函數(shù)通常都可以接受數(shù)組作為參數(shù)來進行運算
50、,此外還有一些專用的函數(shù)適用于處理數(shù)組所特有的運算。本節(jié)就將介紹這些內(nèi)在函數(shù)在數(shù)組領域的應用。,9.9.1 內(nèi)部基本函數(shù),在Fortran語言的數(shù)組表達式中,允許將數(shù)組作為內(nèi)部基本函數(shù)的參數(shù)。此時,內(nèi)部基本函數(shù)的函數(shù)值就是一個同參數(shù)數(shù)組形狀相同的數(shù)組,它的每個位置上的元素值就是被操作數(shù)組對應位置上的數(shù)組元素取該基本函數(shù)所得的值。例如數(shù)組A和B都是形狀相同的一維數(shù)組,則語句B=SQRT(A)的執(zhí)行結果可以表示如下:,9.9.2 矩陣乘積
51、函數(shù),該函數(shù)的作用是執(zhí)行數(shù)值型或邏輯型數(shù)組A與B的矩陣乘法。函數(shù)的原型為:C = MATMUL(A, B)使用時,數(shù)組A和B必須是秩為1或2(也就是一維或二維)的數(shù)值型或邏輯型的有值數(shù)組,且數(shù)組A和B中至少有一個的秩為2。傳入矩陣乘積函數(shù)的數(shù)組A與B的類型必須相同。數(shù)組A與B的矩陣乘積規(guī)則和結果與數(shù)學上的矩陣乘法定義一致,也就是說數(shù)組A的最后一維的長度必須和數(shù)組B的第一維的長度相同。結果數(shù)組C的秩和形狀取決于參數(shù)數(shù)組的秩和形狀:
52、如果A的形狀為(n,m),B的形狀為(m,k),則結果數(shù)組C的秩為2,形狀為(n,k)。如果A的形狀為(m),B的形狀為(m,k),則結果數(shù)組C的秩為1,形狀為(k)。如果A的形狀為(n,m),B的形狀為(m),則結果數(shù)組C的秩為1,形狀為(n)。,9.9.3 向量點乘函數(shù),該函數(shù)的作用是執(zhí)行數(shù)值型或邏輯型數(shù)組A與B的點積乘法。函數(shù)的原型為:C = DOT_PRODUCT(A,B)使用時,數(shù)組A和B必須是秩為1(即數(shù)學上所說的
53、向量,也即一維數(shù)組)的數(shù)值型或邏輯型的有值數(shù)組,且數(shù)組A與B的類型必須相同。一維數(shù)組A與B點乘的結果是標量,函數(shù)的點乘規(guī)則和結果值與數(shù)學上的定義相同。如果一維數(shù)組A和B中有一個的長度為0,且數(shù)組為數(shù)值型數(shù)組,則結果為0;如果數(shù)組為邏輯型數(shù)組,則結果為.FALSE.。例如DOT_PRODUCT((/1,2,3/),(/3,4,5/))的結果為26,計算過程為(1 x 3)+(2 x 4)+(3 x 5))=26。,9.9.4 元素求和
54、函數(shù),元素求和函數(shù)屬于數(shù)組規(guī)約函數(shù)中的一種。數(shù)組規(guī)約函數(shù)是一組功能類似的數(shù)組函數(shù)的統(tǒng)稱。這組函數(shù)的主要作用就是沿著數(shù)組中的某一維,對在屏蔽表達式中值為.TRUE.的所有數(shù)組元素進行某種操作。這組函數(shù)包括SUM、PRODUCT、MAXVAL、MINVAL、COUNT、ANY和ALL函數(shù)。本節(jié)將主要介紹其中的兩種。元素求和函數(shù)的主要作用是沿著數(shù)組中的某一維,對在屏蔽表達式中值為.TRUE.的所有元素求和。函數(shù)的原型為:C = SUM(
55、A[,DIM][,MASK]),9.9.5 元素連乘求積函數(shù),該函數(shù)的主要作用是沿著數(shù)組中的某一維,對在屏蔽表達式中值為.TRUE.的所有數(shù)組元素求連乘積。函數(shù)的原型為:C = PRODUCT(A[,DIM][,MASK])其中的注意事項和說明同元素求和函數(shù)。下面是一些實例。比如數(shù)組A=(/2,4,6/),則PRODUCT(A)的值是48;又如PRODUCT(B,MASK=B<0.0)表示對數(shù)組B中的所有小于0的元素求連乘
56、積。同元素求和函數(shù)一樣,結果C是數(shù)組還是標量也取決于函數(shù)中維的定義和被求積數(shù)組A的大小和形狀。比如數(shù)組A(2,3)=(/2,3,4,5,6,7/),則PRODUCT(A,DIM=1)的值是[(2×3=6),(4×5=20),(6×7=42)];SUM(A,DIM=2)的值是[(2×4×6=48),(3×5×7=105)]。,9.9.6 數(shù)組大小查詢函數(shù),該函數(shù)是數(shù)組
57、查詢函數(shù)中的一種。數(shù)組查詢函數(shù)一組功能類似于數(shù)組函數(shù)的統(tǒng)稱。這組函數(shù)包括:SIZE、SHAPE、ALLOCATED、LBOUND和UBOUND函數(shù)。這里只介紹其中的兩種:數(shù)組大小查詢函數(shù)和數(shù)組形狀查詢函數(shù)。數(shù)組大小查詢函數(shù)的作用是求數(shù)組沿著某一維的長度或者數(shù)組元素的總數(shù)目。函數(shù)原型為:C = SIZE(A[,DIM])其中A是被查詢數(shù)組,可以是假定大小數(shù)組,但不能是未定義的指針數(shù)組或未分配空間的可分配數(shù)組。當DIM等于1時,表示查詢
58、數(shù)組有幾行;當DIM等于2時,表示查詢數(shù)組有幾列;當DIM被省略時,表示查詢數(shù)組有多大(即有多少個元素)。,9.9.7 數(shù)組形狀查詢函數(shù),該函數(shù)的功能就是求數(shù)組或標量的形狀。函數(shù)的原型為:C = SHAPE(A)其中,A表示被查詢對象,可以是標量或數(shù)組,但不能是假定大小數(shù)組、未定義的指針或未分配空間的可分配數(shù)組;C保存查詢結果,是一個一維整型數(shù)組。比如SHAPE(2)將返回一個零長度一維數(shù)組;如果對數(shù)組B(-2:5,9:10)進
59、行查詢,則SHAPE(B)將返回一維數(shù)組(8,2)。,9.9.8 數(shù)組合并函數(shù),數(shù)組合并函數(shù)是數(shù)組構造函數(shù)中的一種。數(shù)組構造函數(shù)也是一系列功能相似的函數(shù)的總稱,它們用于從已有數(shù)組的元素構造出新數(shù)組。這組函數(shù)包括:MERGE、PACK,UNPACK和SPREAD函數(shù)。數(shù)組合并函數(shù)的只要用途就是在屏蔽表達式的控制下,對兩個獨立數(shù)組進行合并操作。該函數(shù)的原型為:C = MERGE(TSOURCE,FSOURCE,MASK)其中,TSO
60、URCE可以是任意類型的數(shù)組或標量,F(xiàn)SOURCE是必須與TSOURCE具有相同的類型和類型參數(shù)的數(shù)組或標量。屏蔽表達式MASK必須是邏輯型數(shù)組;若MASK值為真,則結果是TSOURCE,若MASK值為假,則結果是FSOURCE。,9.9.9 數(shù)組壓縮函數(shù):,該函數(shù)的作用就是在屏蔽表達式的控制下,將數(shù)組壓縮成向量數(shù)組。數(shù)組的原型為:C = PACK(A,MASK[,VECTOR])A表示被壓縮對象,可是任意類型的數(shù)組;屏蔽表達式M
61、ASK必須是邏輯型數(shù)組,并且與數(shù)組A相容(也就是形狀相同);VECTOR是可選參數(shù),必須為向量數(shù)組,并且與數(shù)組A具有相同的類型和類型參數(shù)。結果C是秩為1的數(shù)組(就是一維數(shù)組),其類型和類型參數(shù)與數(shù)組A相同。若VECTOR存在,則結果C的大小等于VECTOR的大小,否則其大小是使屏蔽表達式MASK值為真的元素的個數(shù);若屏蔽表達式MASK為標量并且值為真,則結果C的大小與數(shù)組A相同。結果C中的值按數(shù)組中的元素位置排序,數(shù)組A中的第i個元素
62、對應于屏蔽表達式MASK的第i個為真元素。若VECTOR存在,且大小大n于符合條件的數(shù)組A中的元素個數(shù)t,則結果C中第i個元素值為VECTOR(i),i=t+1,…,n。,9.9.10 數(shù)組形狀擴展和重構形函數(shù),這是一個由兩個函數(shù)組成的函數(shù)族,包括SPREAD函數(shù)與RESHAPE函數(shù),用于完成數(shù)組形狀重構和擴展的任務。SPREAD函數(shù)的主要功能就是將數(shù)組沿著某一維的方向拷貝規(guī)定次數(shù)后擴展成一個新的數(shù)組。函數(shù)的原型為:C = SPR
63、EAD(A,DIM,NCOPIES)其中,A為被拷貝對象,可以是標量或任意類型的數(shù)組。當DIM等于1時,表示沿著第一維下標變化的方向擴展,也稱為向下擴展;當DIM等于2時,表示沿著第二維下標變化方向擴展,也稱為向右擴展。NCOPIES用于指定拷貝的次數(shù)。,9.9.11 數(shù)組轉置函數(shù),數(shù)組轉置函數(shù)是數(shù)組運算函數(shù)中的一種。數(shù)組運算函數(shù)是數(shù)組函數(shù)中同矩陣運算相關的一組函數(shù)的總稱,這組函數(shù)包括:TRANSPOSE、EOSHIFT和CSHIF
64、T三個函數(shù)。數(shù)組轉置函數(shù)的用途就是對秩為2的數(shù)組(就是二維數(shù)組)進行轉置操作。函數(shù)的原型為:C = TRANSPOSE(MATRIX)其中,數(shù)組MATRIX必須是一個二維數(shù)組。轉置后的結果數(shù)組C的形狀正好與數(shù)組MATRIX的形狀相反。也就是說MATRIX(n,m)轉置后的結果為C(m,n)。,9.9.12 去端移動函數(shù),該函數(shù)的作用是對秩為1的數(shù)組作去端移位處理,或沿著某一維對秩大于1的數(shù)組在所有秩為1的完整數(shù)組片段上作去端移位處
65、理。函數(shù)的原型為:C = EOSHIFT(A,SHIFT[,BOUNDARY][,DIM])其中,A為被進行去端移位處理的數(shù)組。SHIFT表示移動的位數(shù),必須為整數(shù);當SHIFT為正時,表示去端左移,當SHIFT為負時,表示去端右移。在數(shù)組或數(shù)組片段的一端被移出的元素被丟棄,并在另一端移入相同數(shù)量的BOUNDARY的值。DIM表示要進行去端移位處理的數(shù)組的維,默認為1。不同的片段可以有不同的BOUNDARY值,并可在不同的方向上移動
66、不同的位數(shù)。,9.9.13 循環(huán)替換函數(shù),該函數(shù)的作用是將秩為1的數(shù)組的所有元素或高維數(shù)組的指定維上的元素進行循環(huán)移動。在一端上移走的元素被插到另一端。函數(shù)的原型為:C = CSHIFT(A,SHIFT[,DIM])其中,A為被操作數(shù)組。SHIFT為正值時被移向左端,負值時則移向右端。DIM可以指定要進行操作的數(shù)組的維,默認值為1。比如數(shù)組A=[1,2,3,4,5,6],則CSHIFT(A,SHIFT=2)的結果是[3,4,5,
67、6,1,2];而CSHIFT(A,SHIFT=-2)的結果則[5,6,1,2,3,4]。,9.9.14 最大值元素定位函數(shù),該函數(shù)是兩個數(shù)組定位函數(shù)之一,另一個不用說也知道是最小值元素定位函數(shù)(MINLOC)。函數(shù)的原型為:C = MAXLOC(A[,DIM][,MASK])函數(shù)根據(jù)屏蔽表達式MASK的真值條件確定數(shù)組A中的所有元素或沿某一維DIM所有元素中第一個最大值元素出現(xiàn)的位置。結果C的形式取決于數(shù)組A的秩:當秩為1時,C為
68、標量;當秩不為1時,C為一維數(shù)組。例如MAXLOC(/1,8,8,7/)的值為[2]。再如數(shù)組A(3,4)的形式為:,,9.10 Fortran90/95的數(shù)組操作語句,Fortran 90/95中提供了許多新的數(shù)組操作語句,例如FORALL、WHERE語句等。這些語句大大提高了Fortran語言中的數(shù)組操作特性,使其在數(shù)值計算領域的優(yōu)勢中得到進一步加強。本小節(jié)將介紹這兩種新的數(shù)組操作語句的特性和用法。,9.10.1 WHERE
69、語句和WHERE構造,在Fortran 90/95中提供了一種新的屏蔽數(shù)組操作語句WHERE,該語句可用于從數(shù)組中提取出部分內(nèi)容進行設置。實質(zhì)上,WHERE語句是一種帶判斷條件的數(shù)組操作語句,也就是說該語句只對那些符合條件要求的數(shù)組元素進行操作。在使用上,可以分為語句形式和構造形式兩種。1.WHERE語句WHERE語句的一般形式為:WHERE(屏蔽表達式) 賦值語句2.WHERE構造除了上面這種語句聲明形式的用法外,還可以使用
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論