![Fortran中的數(shù)組課件_第1頁](http://file4.renrendoc.com/view14/M0B/13/02/wKhkGWeQ232ADiS2AAIjNZwSlNo389.jpg)
![Fortran中的數(shù)組課件_第2頁](http://file4.renrendoc.com/view14/M0B/13/02/wKhkGWeQ232ADiS2AAIjNZwSlNo3892.jpg)
![Fortran中的數(shù)組課件_第3頁](http://file4.renrendoc.com/view14/M0B/13/02/wKhkGWeQ232ADiS2AAIjNZwSlNo3893.jpg)
![Fortran中的數(shù)組課件_第4頁](http://file4.renrendoc.com/view14/M0B/13/02/wKhkGWeQ232ADiS2AAIjNZwSlNo3894.jpg)
![Fortran中的數(shù)組課件_第5頁](http://file4.renrendoc.com/view14/M0B/13/02/wKhkGWeQ232ADiS2AAIjNZwSlNo3895.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
Fortran中的數(shù)組數(shù)組是Fortran語言中功能最為強大、運用最為靈活的一種數(shù)據(jù)結(jié)構(gòu)。數(shù)組(ARRAY)在科學(xué)和工程計算中通常用來表示矩陣和向量。同一般的變數(shù)聲明相比,數(shù)組能夠同時保存多個數(shù)據(jù)。它是一種使用大規(guī)模數(shù)據(jù)的方法。配合Fortran語言中的數(shù)組操作,可用於對大量不同的數(shù)據(jù)進行處理。在存儲結(jié)構(gòu)上,數(shù)組佔用一片連續(xù)的存儲單元。程式中通過數(shù)組索引來對數(shù)組元素、片斷進行操作。9.1數(shù)組的定義要在程式中使用數(shù)組,需要首先在變數(shù)聲明中進行數(shù)組定義。數(shù)組定義規(guī)定了數(shù)組的維數(shù)和大小,以及數(shù)組所能保存的數(shù)據(jù)類型。在程式中,通過數(shù)組引用來對數(shù)組、數(shù)組元素或者數(shù)組片斷進行操作。數(shù)組是類型相同、種別一致的一組變數(shù)的有序集合。它可以是整型、實型、雙精度型、複型、邏輯型、字元型以及自定義類型等中的任意一種。組成數(shù)組的每一個變數(shù)被稱為數(shù)組元素,並由唯一的下標(biāo)來進行標(biāo)識。數(shù)組定義說明了數(shù)組所能保存的數(shù)據(jù)類型、數(shù)組的維數(shù)、維的範(fàn)圍和數(shù)組的大小。本節(jié)主要介紹Fortran中數(shù)組定義的幾種方式。9.1.1定義形式一第一種數(shù)組定義形式的語法格式如下所示。類型說明[::]數(shù)組名([下標(biāo)下界:]下標(biāo)上界[,…])[,…]該定義形式通過類型說明來顯式聲明數(shù)組的數(shù)據(jù)類型,並通過下標(biāo)下界和下標(biāo)上界來規(guī)定數(shù)組中某一維的範(fàn)圍。下標(biāo)下界和下標(biāo)上界共同組成了維說明符。當(dāng)維說明符省略下標(biāo)下界時,默認(rèn)所在維的下標(biāo)從1開始。如下代碼都是合法的數(shù)組定義。REAL::A(1:2,2:4)INTEGERB(10)9.1.2定義形式二第二種數(shù)組定義形式的語法格式如下所示。DIMENSION[::]數(shù)組名([下標(biāo)下界:]下標(biāo)上界[,…])[,…][類型說明[::]數(shù)組名[,…]]該定義形式通過DIMENSION語句來進行數(shù)組的定義,通過下標(biāo)下界和下標(biāo)上界來規(guī)定數(shù)組中某一維的範(fàn)圍。在第二行通過類型說明來顯式聲明數(shù)組的數(shù)據(jù)類型。當(dāng)省略類型說明時,採用默認(rèn)的“I-N”規(guī)則來對數(shù)組的數(shù)據(jù)類型進行定義。如下代碼合法的對數(shù)組進行了定義。DIMENSION::A(10),B(2:11)INTEGER::A9.1.3定義形式三第三種數(shù)組定義形式的語法格式如下所示。DIMENSION([下標(biāo)下界:]下標(biāo)上界[,…])[::]數(shù)組名[,…][類型說明[::]數(shù)組名[,…]]該定義形式通過DIMENSION語句直接說明了數(shù)組的維數(shù)和維的範(fàn)圍。這種形式定義的數(shù)組全部具有相同的維數(shù)和大小。如下代碼表示了如何採用上述形式進行數(shù)組的定義。DIMENSION(10,4:10)::A,B,NINTEGER::AREAL(8)::N9.1.4定義形式四第四種數(shù)組定義形式的語法格式如下所示。[類型說明,]DIMENSION[::]數(shù)組名([下標(biāo)下界:]下標(biāo)上界[,…])[,…][類型說明,]DIMENSION([下標(biāo)下界:]下標(biāo)上界[,…])[::]數(shù)組名[,…]該定義形式可以說是前三種定義形式的綜合形式。通過在DIMENSION語句前引入類型說明來顯式的說明數(shù)組的數(shù)據(jù)類型。下列代碼演示了此種形式的數(shù)組定義。REAL,DIMENSION::I(10),M(10,5)INTEGER,DIMENSION(10)::A,C9.1.5數(shù)組定義的特點上述數(shù)組定義的形式中,中括弧內(nèi)的部分可有可無。數(shù)組定義語句必須出現(xiàn)在所有可執(zhí)行語句之前。除了上述基本的定義形式外,在Fortran77中可以使用COMMON語句,在Fortran90中可以用POINTER語句、ALLOCATABLE語句等對數(shù)組定義進行加強。在前面所述的四種定義形式中,定義形式因簡潔直觀而常見於實際使用中。此外,如下問題是在實際編程中應(yīng)該注意的。在前面所述的數(shù)組定義中,I(10)、M(10,5)、A、C等稱為數(shù)組說明符。在同一個說明語句中有多個數(shù)組說明符時,用逗號進行分隔。數(shù)組說明符中的I、M、A、C等是數(shù)組名,其取名規(guī)則與變數(shù)相同並且不應(yīng)與程式中的其他變數(shù)同名。在同一個程式單元中,一個數(shù)組名只允許定義一次,不能重複定義。例如下麵的數(shù)組定義是錯誤的。INTEGER::A(10),A(10,20)9.2數(shù)組的引用方式數(shù)組經(jīng)過定義之後,就可以在程式中使用了。在Fortran77標(biāo)準(zhǔn)中,數(shù)組只允許在輸入輸出語句中進行整體操作。在其他場合,只能對數(shù)組的元素通過下標(biāo)索引的方式逐個進行操作。到了Fortran90標(biāo)準(zhǔn),這一限制被大大放寬了。數(shù)組除了能夠進行整體操作以外,還能對數(shù)組中的片斷和數(shù)組的整體進行操作。這進一步增強了Fortran語言在數(shù)值處理方面的能力。Fortran中數(shù)組的引用方式可以概括為以下幾種:9.2.1引用數(shù)組元素引用數(shù)組元素的語法格式如下所示。數(shù)組名(下標(biāo),……)這種引用方式通過下標(biāo)索引來對數(shù)組中的每一個元素進行操作。它是Fortran中最為傳統(tǒng)的一種引用方式。採用這種方式進行引用時,下標(biāo)的值不能超出數(shù)組定義時的下標(biāo)上下界。目前市面上絕大部分的Fortran編譯器都會提供在編譯時進行數(shù)組下標(biāo)越界檢查的功能。而其他電腦語言的編譯器,如C/C++編譯器往往不提供這樣的功能,需要程式員自行檢查代碼中是否存在數(shù)組越界的行為。9.2.2引用數(shù)組整體引用數(shù)組整體的語法格式如下所示。數(shù)組名這種引用方式通過數(shù)組名來對數(shù)組進行整體操作。這種引用方式是Fortan90中新增的,大大提高了程式編寫的靈活性和簡單性。我們對前一個例程TEST0901進行修改,通過整體引用來對數(shù)組進行賦值。TEST0902.F90!引用數(shù)組整體的範(fàn)例PROGRAMTEST0902IMPLICITNONE!變數(shù)定義
REAL::A,B(5,5)READ(*,*)A!數(shù)組整體引用
B=AENDPROGRAMTEST09029.2.3引用數(shù)組片斷引用數(shù)組片斷的語法格式如下所示。數(shù)組名(下標(biāo)範(fàn)圍,……)在這種引用方式中,數(shù)組中的元素可以用過數(shù)組片斷來進行引用。當(dāng)需要給數(shù)組中的不同片斷的元素賦予不同數(shù)值時,這種引用方式非常方便。來看下麵一個例子。TEST0903.F90!引用數(shù)組片斷的範(fàn)例PROGRAMTEST0903IMPLICITNONE!變數(shù)定義
REAL::A1,A2,A3,A4,A5,B(5,5)READ(*,*)A1,A2,A3,A4,A5!數(shù)組片斷的引用
B(1,1:5)=A1B(2,1:5)=A2B(3,1:5)=A3B(4,1:5)=A4B(5,1:5)=A5ENDPROGRAMTEST09039.3數(shù)組的存儲儘管在Fortran語言中,允許程式員聲明維數(shù)高達(dá)7維的數(shù)組來使用,但是電腦的記憶體卻只是一維的。所以不管聲明的數(shù)組有幾維,數(shù)組在內(nèi)存中都是以一維的方式來進行存儲。數(shù)組中元素在電腦內(nèi)的存儲順序同時也被用作輸入/輸出時確定其中的元素數(shù)據(jù)在進行操作時的先後順序。9.3.1數(shù)組的存儲結(jié)構(gòu)Fortran中,一維數(shù)組在電腦記憶體中的存儲是最簡單的一種情況。在邏輯結(jié)構(gòu)上,一維數(shù)組可以看成是由一系列數(shù)組元素組成的一個單列數(shù)據(jù)表。數(shù)組中每個元素的下標(biāo)就確定了此元素在數(shù)據(jù)表中的位置。下標(biāo)越小,在數(shù)據(jù)表中的位置就越靠前。在電腦記憶體中,一維數(shù)組佔據(jù)一片連續(xù)的存儲單元,單個元素在內(nèi)存中的位置就是其邏輯結(jié)構(gòu)中的位置。9.3.2數(shù)組存儲結(jié)構(gòu)的應(yīng)用目前的電腦硬體體系結(jié)構(gòu)決定了在讀取大批量數(shù)據(jù)時,如果這一批數(shù)據(jù)都位於臨近的記憶體中時,讀取操作會執(zhí)行得較快。在編寫程式時,如果想要提高執(zhí)行效率,就應(yīng)該對數(shù)據(jù)在計算中的保存方式和讀取方式有一定的瞭解。只有瞭解了數(shù)據(jù)在計算內(nèi)的存儲結(jié)構(gòu),才能在編寫程式的時候做到有的放矢。這樣編寫出來的程式在數(shù)據(jù)的存取效率上才能較高。需要注意的是,儘管Fortran中的數(shù)組是按“列元素優(yōu)先”的規(guī)則進行存儲的,但是C語言中的數(shù)組則是按照“行元素優(yōu)先”的原則進行存儲,並且C語言中數(shù)組的下標(biāo)下界固定是從0開始的。在編寫相關(guān)的程式時,應(yīng)該注意到這一差別。Fortran語言中,使用DO迴圈進行高效率數(shù)組操作的代碼寫法可能在C語言中恰恰是最低效的。比如下麵的程式段在Fortran中能夠得到較好的執(zhí)行效率:DOJ=1,5DOI=1,3Sum=Sum+A(I,J)ENDDO9.4數(shù)組的類型根據(jù)數(shù)組在定義時的特徵,比如數(shù)組的秩、數(shù)組的形狀和每一維的大小,可以將數(shù)組劃分為好幾種類型。這些不同類型的數(shù)組在程式單元中如何使用?在哪些程式單元中使用?有什麼特點?本節(jié)將針對這些問題進行逐一介紹。9.4.1顯形數(shù)組顯形(Explicit-shape)數(shù)組是Fortran中最簡單、最容易理解的一種數(shù)組類型。顧名思義,這種類型的數(shù)組在定義階段就通過數(shù)組定義語句明確的規(guī)定了所有特徵,比如數(shù)組的秩、數(shù)組的維數(shù)、每一維的長度和上下界。通過這種方式定義的數(shù)組具有確定的形狀和大小,在程式運行過程中不允許再對數(shù)組的任何特徵進行改變。需要注意的是,在顯形數(shù)組的維說明中,還允許使用整型變數(shù)或整型運算式來定義維的上下界。這涉及到兩種特殊的顯形數(shù)組,會在隨後的小節(jié)中進行介紹。9.4.2特殊的顯形數(shù)組——自動數(shù)組自動數(shù)組(AutomaticArray)是顯形數(shù)組的一種特殊形式,這種形式的顯形數(shù)組只能是過程中的局部變數(shù)。使用自動數(shù)組時最好在過程中加以聲明,並且數(shù)組中至少有一維的上下界是不確定的整型變數(shù)或整型運算式。在調(diào)用過程時,自動數(shù)組中不確定的上下界首先通過整型變數(shù)或整型運算式求出。這樣,整型變數(shù)或整型運算式的值在過程中發(fā)生的變化,就不會影響到數(shù)組中的上下界。9.4.3特殊的顯形數(shù)組——可調(diào)數(shù)組可調(diào)數(shù)組(AdjustableArray)也是顯形數(shù)組的一種特殊形式,這種類型的顯形數(shù)組只能是過程中的一個啞元??烧{(diào)數(shù)組中至少有一維的上下界不是常數(shù),這個維的上下界只有當(dāng)過程被調(diào)用時才能最終確定。並且該維的上下界運算式中的整型變數(shù)可以是通過過程傳遞的啞元,也可以是通過COMMON語句中傳遞的整型常量或變數(shù)。和自動數(shù)組類似,過程內(nèi)部對維界參數(shù)的賦值不會改變數(shù)組中該維的上下界。9.4.4顯形數(shù)組的不足顯形數(shù)組是數(shù)組應(yīng)用的基礎(chǔ),其中的自動數(shù)組和可調(diào)數(shù)組能夠提供非常靈活的數(shù)組應(yīng)用。比如自動數(shù)組在處理具體數(shù)量未知的大筆數(shù)組數(shù)據(jù)時,能夠提供相當(dāng)好的解決方案。但是有一點需要注意,由於自動數(shù)組和可調(diào)數(shù)組都是通過過程來使用的,因此過程的一些特點也會影響到這兩種數(shù)組的使用。比如使用自動數(shù)組時,過程在電腦中的堆疊限制會妨礙可使用的自動數(shù)組的大小。這種情況可以通過在執(zhí)行TEST0906時,將變數(shù)I設(shè)置成一個大數(shù)(比如100000)來觀察到,此時螢?zāi)簧系牧杏≠Y訊如下:InputthevalueofI:100000forrtl:severe(170):ProgramException-stackoverflowImagePCRoutineLineSourceTEST0307.exe004011DBUnknownUnknown
UnknownTEST0307.exe0040110AUnknownUnknown
UnknownTEST0307.exe0043FCD9UnknownUnknown
UnknownTEST0307.exe00428FF9UnknownUnknown
Unknownkernel32.dll7C816FD7UnknownUnknown
Unknown
Incrementallylinkedimage--PCcorrelationdisabled.9.4.5假定形狀數(shù)組假定形狀(Assumed-shape)數(shù)組是一種在過程中使用的特殊類型數(shù)組,這種類型的數(shù)組借助過程中的啞元從實際傳遞到過程中的數(shù)組獲得自身的形狀參數(shù)。假定形狀數(shù)組的秩由數(shù)組定義中冒號“:”的個數(shù)來決定,其一般形式如下:類型聲明數(shù)組名([下界]:[,[下界]:]...)如果在定義時不指定維的下界值,則默認(rèn)這一維的下界值為1。維的上界值等於過程調(diào)用中實參數(shù)組對應(yīng)維的長度加上定義中規(guī)定的下界值再減去1。假定形狀數(shù)組與可調(diào)數(shù)組的區(qū)別非常細(xì)微:可調(diào)數(shù)組是一種顯型數(shù)組,在定義時必須指定維的上界(儘管這個上界可以是變數(shù)或運算式);而假定形狀數(shù)組在定義時是不能指定維的上界的。來看這樣一個代碼段:SUBROUTINEASSUMEDSHAPE(A)REALA(:,:,:)……ENDSUBROUTINEASSUMEDSHAPE9.4.6假定大小數(shù)組假定大?。ˋssumed-size)數(shù)組也是一種在過程中使用的特殊類型數(shù)組的啞元,這種類型的數(shù)組借助過程中的啞元從實際傳遞到過程中的數(shù)組來獲得自身的大小。1.假定大小數(shù)組的定義:假定大小數(shù)組在聲明時,除了最後一維的上界以外,其他所有特徵(比如數(shù)組的秩、維的長度和維的上下界等)都必須明確指定。聲明假定大小數(shù)組的一般形式如下:類型說明數(shù)組名([維說明符,][維說明符,]...[下界:]*)2.假定大小數(shù)組的應(yīng)用9.4.7延遲形狀數(shù)組延遲形狀(Deferred-shape)數(shù)組是Fortran90/95標(biāo)準(zhǔn)中才開始引入的特殊類型數(shù)組,這種類型的數(shù)組在聲明時並不制定數(shù)組的維界,具體的維界需要在程式執(zhí)行過程中才能確定。延遲形狀數(shù)組的典型代表就是數(shù)組指針和可分配數(shù)組。聲明延遲形狀數(shù)組時,數(shù)組的秩由冒號“:”來確定,但每一維的長度是未知的。數(shù)組的維界和形狀在程式執(zhí)行過程中給延遲形狀數(shù)組分配存儲空間之後才能決定。可分配數(shù)組可以通過ALLOCATABLE語句、DIMENSION語句、TARGET語句或在類型聲明中使用ALLOCATABLE屬性來進行說明;而數(shù)組指針則由POINT語句或在類型聲明中使用POINTER屬性來進行說明。數(shù)組指針的邊界和形狀通過指針賦值語句指向目標(biāo)之後進行確定,或者通過ALLOCATE語句直接進行指針的空間分配;而可分配數(shù)組的邊界和形狀則只能通過ALLOCATABEL語句來進行指定。9.5數(shù)組的動態(tài)分配所謂數(shù)組的動態(tài)分配就是指數(shù)組的大小、形狀等特徵是在程式運行中動態(tài)的確定,而不是在程式聲明段就確定好了的。數(shù)組的動態(tài)分配能給程式設(shè)計提供更大的靈活性。本節(jié)就將介紹有關(guān)數(shù)組動態(tài)分配的有關(guān)內(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ù)組已經(jīng)不再使用,仍然會佔據(jù)分配給它的記憶體空間,這就造成了系統(tǒng)資源的浪費。如果電腦的記憶體資源有限,這會使得其他程式的可用記憶體資源減少。最嚴(yán)重的情況是可用記憶體資源不足,這將導(dǎo)致程式執(zhí)行錯誤。9.5.2可分配數(shù)組的分配與釋放在實際的程式中,往往會碰到這樣的問題:一些數(shù)組的大小在程式執(zhí)行之前並不知道具體的大小,只能在程式運行的過程中才能確定。那麼如何解決這類問題呢?一個辦法就是為程式聲明一個足夠大的數(shù)組,大到將數(shù)據(jù)一股腦全裝進去後還有富裕。但是這又會造成存儲空間的浪費,在過去386、486的時代,浪費寶貴的記憶體無疑就是犯罪。另一種辦法就是前面提到過的自動數(shù)組,這需要用到過程的概念和良好的程式設(shè)計結(jié)構(gòu)。如果碰到有些數(shù)組需要作為全局變數(shù)在不同的過程中進行處理的情況,就只好採用開一個大數(shù)組的辦法來解決。為了更有效的利用電腦中的記憶體,F(xiàn)ortran90/95標(biāo)準(zhǔn)中正是引入了可分配數(shù)組的概念。通過ALLOCATE語句可以動態(tài)的創(chuàng)建可分配數(shù)組,使記憶體和對象可以在程式開始運行之後才建立起相互聯(lián)繫。9.5.3可分配數(shù)組的應(yīng)用實例下麵的代碼實例演示了可分配數(shù)組在程式中的應(yīng)用,以加深對可分配數(shù)組的理解。(詳細(xì)內(nèi)容請參照本書)9.6數(shù)組賦值當(dāng)數(shù)組配置好記憶體空間後,可以通過賦值語句或是數(shù)組構(gòu)造器為數(shù)組中的元素進行賦值。Fortran語言中,數(shù)組的賦值可以通過賦值語句、DATA語句和數(shù)組構(gòu)造器這三種手段來進行。9.6.1數(shù)組賦值語句首先介紹數(shù)組賦值語句。數(shù)組賦值語句是Fortran90/95標(biāo)準(zhǔn)中新增加的數(shù)組賦值手段。數(shù)組賦值語句的基本形式為:數(shù)組對象=value其中,數(shù)組對象代表數(shù)組名或數(shù)組片段,value表示數(shù)組運算式或者標(biāo)量。當(dāng)value為數(shù)組運算式時,必須和數(shù)組對象具有相同的形狀(即維數(shù)相同、每維長度相同,但上下界可以不同);當(dāng)value大小為0或者是長度為0的字元型變數(shù)時,則沒有值賦給數(shù)組對象;當(dāng)value為標(biāo)量時,會把value處理成與數(shù)組對象相同的形狀,此時數(shù)組對象的每個元素均等於標(biāo)量value的值。數(shù)組運算式中允許使用“+”、“-”、“*”、“/”、“**”等內(nèi)部算術(shù)操作符。9.6.2數(shù)組構(gòu)造器數(shù)組構(gòu)造器是由括弧和斜線對之間的一系列數(shù)值組成,其一般形式為:數(shù)組名=(/取值列表/)其中,取值列表可以是標(biāo)量,隱式DO迴圈或者任意秩的數(shù)組。取值列表中所有數(shù)值的類型都應(yīng)該相同,數(shù)值之間以逗號分隔。如果取值列表中出現(xiàn)了數(shù)組,則它的值是按“列元素優(yōu)先”的規(guī)則來賦給目標(biāo)數(shù)組變數(shù)。數(shù)組構(gòu)造器的標(biāo)識“(/”和“/)”在書寫時要注意,括弧和撇號之間不能有空格。下麵來看一些實例。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迴圈DE=(/10,A(2:7),(I,I=1,4),7/) !混合表示9.6.3DATA語句DATA語句從Fortran77時代開始就已經(jīng)用於數(shù)組的賦值,只適用於數(shù)組初值的設(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語句是一種特殊的說明語句,與普通的說明語句有很大的不同。普通的說明語句必須放在說明段中,也就是必須放在可執(zhí)行語句之前。但是DATA語句允許出現(xiàn)在程式單元結(jié)束語句END前的任意位置。由於DATA語句是在編譯期間就會執(zhí)行的語句,因此,不管程式中出現(xiàn)多少條DATA語句,也不管DATA語句出現(xiàn)在什麼位置,同一個變數(shù)在程式執(zhí)行前只允許有一個值。這個值以出現(xiàn)在程式中的最後一條DATA語句的賦值為準(zhǔn)。這就是為什麼在本小節(jié)開始說DATA只適用於設(shè)置初值的緣故。9.7數(shù)組的輸入輸出在Fortran語言中,數(shù)組的操作方式非常豐富。其中,對數(shù)組的輸入/輸出操作即可以使用隱式DO迴圈來指定要進行輸入/輸出的每一維數(shù)組元素的起始位置、終止位置和步長增量,也可以直接給出要進行輸入/輸出的數(shù)組名、數(shù)組元素以及數(shù)組片段。下麵將分別進行講解。9.7.1一維數(shù)組的輸入輸出一維數(shù)組的輸入/輸出操作是數(shù)組操作中最簡單的情況,也是二維、三維乃至更高維數(shù)組輸入/輸出操作的基礎(chǔ)。只要掌握了一維數(shù)組的輸入/輸出操作方法,其他高維數(shù)組的輸入/輸出操作就很容易理解。由於一維數(shù)組在電腦記憶體中進行存儲時是線性排列的,因此輸入/輸出操作時,數(shù)據(jù)是按照數(shù)組給出的下標(biāo)值依次進行輸入/輸出的。在對一維數(shù)組進行輸入/輸出操作時,即可以將整個數(shù)組作為輸入/輸出操作的對象,也可以只輸入/輸出數(shù)組中的一個元素、一個片斷。9.7.2二維數(shù)組的輸入輸出二維數(shù)組輸入/輸出操作的基礎(chǔ)就是一維數(shù)組的輸入/輸出操作,兩者沒有本質(zhì)上的不同。數(shù)組元素輸入/輸出的順序是按照前面提到過的數(shù)組在電腦記憶體中的存儲順序來進行的。由於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)>Array(3,2)>Array(1,3)>Array(2,3)>Array(3,3)按“列元素優(yōu)先”的方式進行存貯的做法與數(shù)學(xué)上按行進行處理的習(xí)慣不太不一致,在進行輸入操作應(yīng)該引起足夠的注意。給數(shù)組中各元素賦值時,應(yīng)該先輸入第一列元素的值,再輸入第二列、第三列、……上元素的值,這樣才能確保電腦內(nèi)接收到的矩陣是正確的。9.7.3其他高維數(shù)組的輸入輸出更高維數(shù)組的輸入輸出方式也是以一維數(shù)組的輸入輸出為基礎(chǔ)的。在輸入時,總是最低維上的下標(biāo)值變化最快。例如一個2X2X2的三維數(shù)組Mx,在使用數(shù)組名進行系統(tǒng)默認(rèn)的輸入操作時,讀入數(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迴圈內(nèi)外層迴圈變數(shù)的方法來實現(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ù)值計算領(lǐng)域的一大絕活。當(dāng)其他電腦語言還在使用DO迴圈、for迴圈或是其他形式的迴圈來為數(shù)組賦初值時,F(xiàn)ortran早已通過數(shù)組的整體賦值完成了這一工作,並開始了對數(shù)據(jù)的處理。當(dāng)其他電腦語言好容易把一大票數(shù)據(jù)讀入到電腦之後,又開始用DO迴圈、for迴圈或是其他形式的迴圈將剛讀入的兩個巨型數(shù)組相加、相減以得到結(jié)果時,F(xiàn)ortran早已通過數(shù)組的算術(shù)運算完成了這些工作開始輸出結(jié)果了。數(shù)組間的運算是Fortran90/95標(biāo)準(zhǔn)中有利於數(shù)值計算的新手段。在Fortran77時代,數(shù)組間的運算也只能通過迴圈的手段來實現(xiàn)。在新的Fortran標(biāo)準(zhǔn)中,允許把整個數(shù)組或數(shù)組的一部分(即數(shù)組片段)作為一個獨立的對象進行相關(guān)的運算。前提是進行數(shù)組運算的兩個獨立對象應(yīng)該是大小相同、形狀一致。在Fortran語言中,允許將數(shù)組或數(shù)組片斷作為運算對象的運算符包括:所有的算術(shù)運算符(包括“+”、“-”、“*”、“/”、“**”五種)所有的邏輯運算符(包括“.AND.”、“.OR.”、“.NOT.”、“.NEQV.”、“.EQV.
”五種)所有的關(guān)係運算符(包括“.LT.(<)”、“.LE.(<=)”、“.EQ.(=)”、“.NE.(/=)”“.GT.(>)”、“.GE.(>=)”六種)9.8.1算術(shù)運算在數(shù)組的算術(shù)運算運算式中,允許出現(xiàn)的對象包括數(shù)組、數(shù)組片斷、數(shù)組元素和標(biāo)量。不同對象之間的運算有自身的特定規(guī)則和行為模式。1.算術(shù)運算的規(guī)則如果算術(shù)運算符兩側(cè)的運算對象都是數(shù)組或數(shù)組片斷,則要求兩個數(shù)組或數(shù)組片斷應(yīng)該是大小相同、形狀一致的。運算在兩個數(shù)組或數(shù)組片斷對應(yīng)位置上的數(shù)組元素間進行,保存結(jié)果的數(shù)組或數(shù)組片斷也應(yīng)該和運算對象大小相同、形狀一致。2.算術(shù)運算的行為模式9.8.2邏輯運算在數(shù)組的邏輯運算運算式中,允許出現(xiàn)的對象包括數(shù)組、數(shù)組片斷、數(shù)組元素和標(biāo)量。如果邏輯運算符兩側(cè)的運算對象都是數(shù)組或數(shù)組片斷,則要求兩個數(shù)組或數(shù)組片斷應(yīng)該是大小相同、形狀一致的。運算在兩個數(shù)組或數(shù)組片斷對應(yīng)位置上的數(shù)組元素間進行,保存結(jié)果的數(shù)組或數(shù)組片斷也應(yīng)該和運算對象大小相同、形狀一致。如果邏輯運算符兩側(cè)的運算對象一個是數(shù)組或數(shù)組片斷,另一個是數(shù)組元素或標(biāo)量,則運算在數(shù)組或數(shù)組片斷與數(shù)組元素或標(biāo)量之間進行。保存結(jié)果的數(shù)組或數(shù)組片斷應(yīng)該與參與運算的數(shù)組或數(shù)組片斷大小相同、形狀一致。9.8.3關(guān)係運算數(shù)組之間的關(guān)係運算在運算對象、運算規(guī)律上與數(shù)組的算術(shù)運算和邏輯運算沒什麼兩樣。假設(shè)數(shù)組A用於保存運算結(jié)果,數(shù)組B是雙目關(guān)係運算中的一個運算對象,C是另一個運算對象(可以是數(shù)組,也可以是可用於關(guān)係運算的其他標(biāo)量),符號“&”表示任意一種關(guān)係運算符。則語句“A=B&C”類似於執(zhí)行表所示的操作:數(shù)組的關(guān)係運算操作當(dāng)C為數(shù)組時當(dāng)C為標(biāo)量時DOJ=1,NDOI=1,MA(I,J)=B(I,J)&C(I,J)ENDDOENDDODOJ=1,NDOI=1,MA(I,J)=B(I,J)&CENDDOENDDO9.9常用內(nèi)在函數(shù)Fortran語言中的內(nèi)在函數(shù)通常都可以接受數(shù)組作為參數(shù)來進行運算,此外還有一些專用的函數(shù)適用於處理數(shù)組所特有的運算。本節(jié)就將介紹這些內(nèi)在函數(shù)在數(shù)組領(lǐng)域的應(yīng)用。9.9.1內(nèi)部基本函數(shù)在Fortran語言的數(shù)組運算式中,允許將數(shù)組作為內(nèi)部基本函數(shù)的參數(shù)。此時,內(nèi)部基本函數(shù)的函數(shù)值就是一個同參數(shù)數(shù)組形狀相同的數(shù)組,它的每個位置上的元素值就是被運算元組對應(yīng)位置上的數(shù)組元素取該基本函數(shù)所得的值。例如數(shù)組A和B都是形狀相同的一維數(shù)組,則語句B=SQRT(A)的執(zhí)行結(jié)果可以表示如下:9.9.2矩陣乘積函數(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ī)則和結(jié)果與數(shù)學(xué)上的矩陣乘法定義一致,也就是說數(shù)組A的最後一維的長度必須和數(shù)組B的第一維的長度相同。結(jié)果數(shù)組C的秩和形狀取決於參數(shù)數(shù)組的秩和形狀:如果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向量點乘函數(shù)該函數(shù)的作用是執(zhí)行數(shù)值型或邏輯型數(shù)組A與B的點積乘法。函數(shù)的原型為:C=DOT_PRODUCT(A,B)使用時,數(shù)組A和B必須是秩為1(即數(shù)學(xué)上所說的向量,也即一維數(shù)組)的數(shù)值型或邏輯型的有值數(shù)組,且數(shù)組A與B的類型必須相同。一維數(shù)組A與B點乘的結(jié)果是標(biāo)量,函數(shù)的點乘規(guī)則和結(jié)果值與數(shù)學(xué)上的定義相同。如果一維數(shù)組A和B中有一個的長度為0,且數(shù)組為數(shù)值型數(shù)組,則結(jié)果為0;如果數(shù)組為邏輯型數(shù)組,則結(jié)果為.FALSE.。例如DOT_PRODUCT((/1,2,3/),(/3,4,5/))的結(jié)果為26,計算過程為(1x3)+(2x4)+(3x5))=26。9.9.4元素求和函數(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(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的元素求連乘積。同元素求和函數(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ù)組查詢函數(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ù)組。當(dāng)DIM等於1時,表示查詢數(shù)組有幾行;當(dāng)DIM等於2時,表示查詢數(shù)組有幾列;當(dāng)DIM被省略時,表示查詢數(shù)組有多大(即有多少個元素)。9.9.7數(shù)組形狀查詢函數(shù)該函數(shù)的功能就是求數(shù)組或標(biāo)量的形狀。函數(shù)的原型為:C=SHAPE(A)其中,A表示被查詢對象,可以是標(biāo)量或數(shù)組,但不能是假定大小數(shù)組、未定義的指針或未分配空間的可分配數(shù)組;C保存查詢結(jié)果,是一個一維整型數(shù)組。比如SHAPE(2)將返回一個零長度一維數(shù)組;如果對數(shù)組B(-2:5,9:10)進行查詢,則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ù)的只要用途就是在遮罩運算式的控制下,對兩個獨立數(shù)組進行合併操作。該函數(shù)的原型為:C=MERGE(TSOURCE,FSOURCE,MASK)其中,TSOURCE可以是任意類型的數(shù)組或標(biāo)量,F(xiàn)SOURCE是必須與TSOURCE具有相同的類型和類型參數(shù)的數(shù)組或標(biāo)量。遮罩運算式MASK必須是邏輯型數(shù)組;若MASK值為真,則結(jié)果是TSOURCE,若MASK值為假,則結(jié)果是FSOURCE。9.9.9數(shù)組壓縮函數(shù):該函數(shù)的作用就是在遮罩運算式的控制下,將數(shù)組壓縮成向量數(shù)組。數(shù)組的原型為:C=PACK(A,MASK[,VECTOR])A表示被壓縮對象,可是任意類型的數(shù)組;遮罩運算式MASK必須是邏輯型數(shù)組,並且與數(shù)組A相容(也就是形狀相同);VECTOR是可選參數(shù),必須為向量數(shù)組,並且與數(shù)組A具有相同的類型和類型參數(shù)。結(jié)果C是秩為1的數(shù)組(就是一維數(shù)組),其類型和類型參數(shù)與數(shù)組A相同。若VECTOR存在,則結(jié)果C的大小等於VECTOR的大小,否則其大小是使遮罩運算式MASK值為真的元素的個數(shù);若遮罩運算式MASK為標(biāo)量並且值為真,則結(jié)果C的大小與數(shù)組A相同。結(jié)果C中的值按數(shù)組中的元素位置排序,數(shù)組A中的第i個元素對應(yīng)於遮罩運算式MASK的第i個為真元素。若VECTOR存在,且大小大n於符合條件的數(shù)組A中的元素個數(shù)t,則結(jié)果C中第i個元素值為VECTOR(i),i=t+1,…,n。9.9.10數(shù)組形狀擴展和重構(gòu)形函數(shù)這是一個由兩個函數(shù)組成的函數(shù)族,包括SPREAD函數(shù)與RESHAPE函數(shù),用於完成數(shù)組形狀重構(gòu)和擴展的任務(wù)。SPREAD函數(shù)的主要功能就是將數(shù)組沿著某一維的方向拷貝規(guī)定次數(shù)後擴展成一個新的數(shù)組。函數(shù)的原型為:C=SPREAD(A,DIM,NCOPIES)其中,A為被拷貝對象,可以是標(biāo)量或任意類型的數(shù)組。當(dāng)DIM等於1時,表示沿著第一維下標(biāo)變化的方向擴展,也稱為向下擴展;當(dāng)DIM等於2時,表示沿著第二維下標(biāo)變化方向擴展,也稱為向右擴展。NCOPIES用於指定拷貝的次數(shù)。9.9.11數(shù)組轉(zhuǎn)置函數(shù)數(shù)組轉(zhuǎn)置函數(shù)是數(shù)組運算函數(shù)中的一種。數(shù)組運算函數(shù)是數(shù)組函數(shù)中同矩陣運算相關(guān)的一組函數(shù)的總稱,這組函數(shù)包括:TRANSPOSE、EOSHIFT和CSHIFT三個函數(shù)。數(shù)組轉(zhuǎn)置函數(shù)的用途就是對秩為2的數(shù)組(就是二維數(shù)組)進行轉(zhuǎn)置操作。函數(shù)的原型為:C=TRANSPOSE(MATRIX)其中,數(shù)組MATRIX必須是一個二維數(shù)組。轉(zhuǎn)置後的結(jié)果數(shù)組C的形狀正好與數(shù)組MATRIX的形狀相反。也就是說MATRIX(n,m)轉(zhuǎn)置後的結(jié)果為C(m,n)。9.9.12去端移動函數(shù)該函數(shù)的作用是對秩為1的數(shù)組作去端移位處理,或
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代遠(yuǎn)程教育在商業(yè)培訓(xùn)中的應(yīng)用
- 現(xiàn)代城市公共安全體系建設(shè)
- 國慶節(jié)國旗外擺活動方案
- 環(huán)保教育在廠區(qū)綠色轉(zhuǎn)型中的作用
- 生產(chǎn)線智能化改造的步驟與技巧
- 煙臺的綠色交通系統(tǒng)與低碳出行模式
- 環(huán)保法規(guī)下的企業(yè)生態(tài)環(huán)境預(yù)警管理
- 環(huán)境影響評估在交通運輸規(guī)劃中的角色
- 打樁安全施工方案
- 4《選舉產(chǎn)生班委會 》第三課時(說課稿)部編版道德與法治五年級上冊
- 2025版林木砍伐與生態(tài)修復(fù)工程承包合同2篇
- 2025年南京信息職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025-2030年中國硫酸鉀行業(yè)深度調(diào)研及投資戰(zhàn)略研究報告
- 課題申報參考:社會網(wǎng)絡(luò)視角下村改居社區(qū)公共空間優(yōu)化與“土客關(guān)系”重構(gòu)研究
- 鄉(xiāng)鎮(zhèn)衛(wèi)生院2025年工作計劃
- 2024年山東省泰安市初中學(xué)業(yè)水平生物試題含答案
- 住建局條文解讀新規(guī)JGJT46-2024《施工現(xiàn)場臨時用電安全技術(shù)標(biāo)準(zhǔn)》
- 物流公司軟件售后服務(wù)流程方案
- 機械工程類基礎(chǔ)知識單選題100道及答案解析
- 微生物組與膽汁性肝硬化
- 建筑工程技術(shù)資料管理.ppt
評論
0/150
提交評論