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