版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Fortran中的數組數組是Fortran語言中功能最為強大、運用最為靈活的一種數據結構。數組(ARRAY)在科學和工程計算中通常用來表示矩陣和向量。同一般的變數聲明相比,數組能夠同時保存多個數據。它是一種使用大規模數據的方法。配合Fortran語言中的數組操作,可用於對大量不同的數據進行處理。在存儲結構上,數組佔用一片連續的存儲單元。程式中通過數組索引來對數組元素、片斷進行操作。9.1數組的定義要在程式中使用數組,需要首先在變數聲明中進行數組定義。數組定義規定了數組的維數和大小,以及數組所能保存的數據類型。在程式中,通過數組引用來對數組、數組元素或者數組片斷進行操作。數組是類型相同、種別一致的一組變數的有序集合。它可以是整型、實型、雙精度型、複型、邏輯型、字元型以及自定義類型等中的任意一種。組成數組的每一個變數被稱為數組元素,並由唯一的下標來進行標識。數組定義說明了數組所能保存的數據類型、數組的維數、維的範圍和數組的大小。本節主要介紹Fortran中數組定義的幾種方式。9.1.1定義形式一第一種數組定義形式的語法格式如下所示。類型說明[::]數組名([下標下界:]下標上界[,…])[,…]該定義形式通過類型說明來顯式聲明數組的數據類型,並通過下標下界和下標上界來規定數組中某一維的範圍。下標下界和下標上界共同組成了維說明符。當維說明符省略下標下界時,默認所在維的下標從1開始。如下代碼都是合法的數組定義。REAL::A(1:2,2:4)INTEGERB(10)9.1.2定義形式二第二種數組定義形式的語法格式如下所示。DIMENSION[::]數組名([下標下界:]下標上界[,…])[,…][類型說明[::]數組名[,…]]該定義形式通過DIMENSION語句來進行數組的定義,通過下標下界和下標上界來規定數組中某一維的範圍。在第二行通過類型說明來顯式聲明數組的數據類型。當省略類型說明時,採用默認的“I-N”規則來對數組的數據類型進行定義。如下代碼合法的對數組進行了定義。DIMENSION::A(10),B(2:11)INTEGER::A9.1.3定義形式三第三種數組定義形式的語法格式如下所示。DIMENSION([下標下界:]下標上界[,…])[::]數組名[,…][類型說明[::]數組名[,…]]該定義形式通過DIMENSION語句直接說明了數組的維數和維的範圍。這種形式定義的數組全部具有相同的維數和大小。如下代碼表示了如何採用上述形式進行數組的定義。DIMENSION(10,4:10)::A,B,NINTEGER::AREAL(8)::N9.1.4定義形式四第四種數組定義形式的語法格式如下所示。[類型說明,]DIMENSION[::]數組名([下標下界:]下標上界[,…])[,…][類型說明,]DIMENSION([下標下界:]下標上界[,…])[::]數組名[,…]該定義形式可以說是前三種定義形式的綜合形式。通過在DIMENSION語句前引入類型說明來顯式的說明數組的數據類型。下列代碼演示了此種形式的數組定義。REAL,DIMENSION::I(10),M(10,5)INTEGER,DIMENSION(10)::A,C9.1.5數組定義的特點上述數組定義的形式中,中括弧內的部分可有可無。數組定義語句必須出現在所有可執行語句之前。除了上述基本的定義形式外,在Fortran77中可以使用COMMON語句,在Fortran90中可以用POINTER語句、ALLOCATABLE語句等對數組定義進行加強。在前面所述的四種定義形式中,定義形式因簡潔直觀而常見於實際使用中。此外,如下問題是在實際編程中應該注意的。在前面所述的數組定義中,I(10)、M(10,5)、A、C等稱為數組說明符。在同一個說明語句中有多個數組說明符時,用逗號進行分隔。數組說明符中的I、M、A、C等是數組名,其取名規則與變數相同並且不應與程式中的其他變數同名。在同一個程式單元中,一個數組名只允許定義一次,不能重複定義。例如下麵的數組定義是錯誤的。INTEGER::A(10),A(10,20)9.2數組的引用方式數組經過定義之後,就可以在程式中使用了。在Fortran77標準中,數組只允許在輸入輸出語句中進行整體操作。在其他場合,只能對數組的元素通過下標索引的方式逐個進行操作。到了Fortran90標準,這一限制被大大放寬了。數組除了能夠進行整體操作以外,還能對數組中的片斷和數組的整體進行操作。這進一步增強了Fortran語言在數值處理方面的能力。Fortran中數組的引用方式可以概括為以下幾種:9.2.1引用數組元素引用數組元素的語法格式如下所示。數組名(下標,……)這種引用方式通過下標索引來對數組中的每一個元素進行操作。它是Fortran中最為傳統的一種引用方式。採用這種方式進行引用時,下標的值不能超出數組定義時的下標上下界。目前市面上絕大部分的Fortran編譯器都會提供在編譯時進行數組下標越界檢查的功能。而其他電腦語言的編譯器,如C/C++編譯器往往不提供這樣的功能,需要程式員自行檢查代碼中是否存在數組越界的行為。9.2.2引用數組整體引用數組整體的語法格式如下所示。數組名這種引用方式通過數組名來對數組進行整體操作。這種引用方式是Fortan90中新增的,大大提高了程式編寫的靈活性和簡單性。我們對前一個例程TEST0901進行修改,通過整體引用來對數組進行賦值。TEST0902.F90!引用數組整體的範例PROGRAMTEST0902IMPLICITNONE!變數定義
REAL::A,B(5,5)READ(*,*)A!數組整體引用
B=AENDPROGRAMTEST09029.2.3引用數組片斷引用數組片斷的語法格式如下所示。數組名(下標範圍,……)在這種引用方式中,數組中的元素可以用過數組片斷來進行引用。當需要給數組中的不同片斷的元素賦予不同數值時,這種引用方式非常方便。來看下麵一個例子。TEST0903.F90!引用數組片斷的範例PROGRAMTEST0903IMPLICITNONE!變數定義
REAL::A1,A2,A3,A4,A5,B(5,5)READ(*,*)A1,A2,A3,A4,A5!數組片斷的引用
B(1,1:5)=A1B(2,1:5)=A2B(3,1:5)=A3B(4,1:5)=A4B(5,1:5)=A5ENDPROGRAMTEST09039.3數組的存儲儘管在Fortran語言中,允許程式員聲明維數高達7維的數組來使用,但是電腦的記憶體卻只是一維的。所以不管聲明的數組有幾維,數組在內存中都是以一維的方式來進行存儲。數組中元素在電腦內的存儲順序同時也被用作輸入/輸出時確定其中的元素數據在進行操作時的先後順序。9.3.1數組的存儲結構Fortran中,一維數組在電腦記憶體中的存儲是最簡單的一種情況。在邏輯結構上,一維數組可以看成是由一系列數組元素組成的一個單列數據表。數組中每個元素的下標就確定了此元素在數據表中的位置。下標越小,在數據表中的位置就越靠前。在電腦記憶體中,一維數組佔據一片連續的存儲單元,單個元素在內存中的位置就是其邏輯結構中的位置。9.3.2數組存儲結構的應用目前的電腦硬體體系結構決定了在讀取大批量數據時,如果這一批數據都位於臨近的記憶體中時,讀取操作會執行得較快。在編寫程式時,如果想要提高執行效率,就應該對數據在計算中的保存方式和讀取方式有一定的瞭解。只有瞭解了數據在計算內的存儲結構,才能在編寫程式的時候做到有的放矢。這樣編寫出來的程式在數據的存取效率上才能較高。需要注意的是,儘管Fortran中的數組是按“列元素優先”的規則進行存儲的,但是C語言中的數組則是按照“行元素優先”的原則進行存儲,並且C語言中數組的下標下界固定是從0開始的。在編寫相關的程式時,應該注意到這一差別。Fortran語言中,使用DO迴圈進行高效率數組操作的代碼寫法可能在C語言中恰恰是最低效的。比如下麵的程式段在Fortran中能夠得到較好的執行效率:DOJ=1,5DOI=1,3Sum=Sum+A(I,J)ENDDO9.4數組的類型根據數組在定義時的特徵,比如數組的秩、數組的形狀和每一維的大小,可以將數組劃分為好幾種類型。這些不同類型的數組在程式單元中如何使用?在哪些程式單元中使用?有什麼特點?本節將針對這些問題進行逐一介紹。9.4.1顯形數組顯形(Explicit-shape)數組是Fortran中最簡單、最容易理解的一種數組類型。顧名思義,這種類型的數組在定義階段就通過數組定義語句明確的規定了所有特徵,比如數組的秩、數組的維數、每一維的長度和上下界。通過這種方式定義的數組具有確定的形狀和大小,在程式運行過程中不允許再對數組的任何特徵進行改變。需要注意的是,在顯形數組的維說明中,還允許使用整型變數或整型運算式來定義維的上下界。這涉及到兩種特殊的顯形數組,會在隨後的小節中進行介紹。9.4.2特殊的顯形數組——自動數組自動數組(AutomaticArray)是顯形數組的一種特殊形式,這種形式的顯形數組只能是過程中的局部變數。使用自動數組時最好在過程中加以聲明,並且數組中至少有一維的上下界是不確定的整型變數或整型運算式。在調用過程時,自動數組中不確定的上下界首先通過整型變數或整型運算式求出。這樣,整型變數或整型運算式的值在過程中發生的變化,就不會影響到數組中的上下界。9.4.3特殊的顯形數組——可調數組可調數組(AdjustableArray)也是顯形數組的一種特殊形式,這種類型的顯形數組只能是過程中的一個啞元。可調數組中至少有一維的上下界不是常數,這個維的上下界只有當過程被調用時才能最終確定。並且該維的上下界運算式中的整型變數可以是通過過程傳遞的啞元,也可以是通過COMMON語句中傳遞的整型常量或變數。和自動數組類似,過程內部對維界參數的賦值不會改變數組中該維的上下界。9.4.4顯形數組的不足顯形數組是數組應用的基礎,其中的自動數組和可調數組能夠提供非常靈活的數組應用。比如自動數組在處理具體數量未知的大筆數組數據時,能夠提供相當好的解決方案。但是有一點需要注意,由於自動數組和可調數組都是通過過程來使用的,因此過程的一些特點也會影響到這兩種數組的使用。比如使用自動數組時,過程在電腦中的堆疊限制會妨礙可使用的自動數組的大小。這種情況可以通過在執行TEST0906時,將變數I設置成一個大數(比如100000)來觀察到,此時螢幕上的列印資訊如下:InputthevalueofI:100000forrtl:severe(170):ProgramException-stackoverflowImagePCRoutineLineSourceTEST0307.exe004011DBUnknownUnknown
UnknownTEST0307.exe0040110AUnknownUnknown
UnknownTEST0307.exe0043FCD9UnknownUnknown
UnknownTEST0307.exe00428FF9UnknownUnknown
Unknownkernel32.dll7C816FD7UnknownUnknown
Unknown
Incrementallylinkedimage--PCcorrelationdisabled.9.4.5假定形狀數組假定形狀(Assumed-shape)數組是一種在過程中使用的特殊類型數組,這種類型的數組借助過程中的啞元從實際傳遞到過程中的數組獲得自身的形狀參數。假定形狀數組的秩由數組定義中冒號“:”的個數來決定,其一般形式如下:類型聲明數組名([下界]:[,[下界]:]...)如果在定義時不指定維的下界值,則默認這一維的下界值為1。維的上界值等於過程調用中實參數組對應維的長度加上定義中規定的下界值再減去1。假定形狀數組與可調數組的區別非常細微:可調數組是一種顯型數組,在定義時必須指定維的上界(儘管這個上界可以是變數或運算式);而假定形狀數組在定義時是不能指定維的上界的。來看這樣一個代碼段:SUBROUTINEASSUMEDSHAPE(A)REALA(:,:,:)……ENDSUBROUTINEASSUMEDSHAPE9.4.6假定大小數組假定大小(Assumed-size)數組也是一種在過程中使用的特殊類型數組的啞元,這種類型的數組借助過程中的啞元從實際傳遞到過程中的數組來獲得自身的大小。1.假定大小數組的定義:假定大小數組在聲明時,除了最後一維的上界以外,其他所有特徵(比如數組的秩、維的長度和維的上下界等)都必須明確指定。聲明假定大小數組的一般形式如下:類型說明數組名([維說明符,][維說明符,]...[下界:]*)2.假定大小數組的應用9.4.7延遲形狀數組延遲形狀(Deferred-shape)數組是Fortran90/95標準中才開始引入的特殊類型數組,這種類型的數組在聲明時並不制定數組的維界,具體的維界需要在程式執行過程中才能確定。延遲形狀數組的典型代表就是數組指針和可分配數組。聲明延遲形狀數組時,數組的秩由冒號“:”來確定,但每一維的長度是未知的。數組的維界和形狀在程式執行過程中給延遲形狀數組分配存儲空間之後才能決定。可分配數組可以通過ALLOCATABLE語句、DIMENSION語句、TARGET語句或在類型聲明中使用ALLOCATABLE屬性來進行說明;而數組指針則由POINT語句或在類型聲明中使用POINTER屬性來進行說明。數組指針的邊界和形狀通過指針賦值語句指向目標之後進行確定,或者通過ALLOCATE語句直接進行指針的空間分配;而可分配數組的邊界和形狀則只能通過ALLOCATABEL語句來進行指定。9.5數組的動態分配所謂數組的動態分配就是指數組的大小、形狀等特徵是在程式運行中動態的確定,而不是在程式聲明段就確定好了的。數組的動態分配能給程式設計提供更大的靈活性。本節就將介紹有關數組動態分配的有關內容。9.5.1自動數組與可分配數組從存儲狀態來說,數組可以劃分為靜態數組和動態數組兩種。如果數組是靜態的,那麼在編譯階段就會為數組分配好固定的儲存空間,這些存儲空間在程式執行過程中會一直保留的,直到程式退出時才會被釋放。程式運行過程中,靜態數組的大小不會發生改變。靜態數組的一個主要缺陷在於,即使數組已經不再使用,仍然會佔據分配給它的記憶體空間,這就造成了系統資源的浪費。如果電腦的記憶體資源有限,這會使得其他程式的可用記憶體資源減少。最嚴重的情況是可用記憶體資源不足,這將導致程式執行錯誤。9.5.2可分配數組的分配與釋放在實際的程式中,往往會碰到這樣的問題:一些數組的大小在程式執行之前並不知道具體的大小,只能在程式運行的過程中才能確定。那麼如何解決這類問題呢?一個辦法就是為程式聲明一個足夠大的數組,大到將數據一股腦全裝進去後還有富裕。但是這又會造成存儲空間的浪費,在過去386、486的時代,浪費寶貴的記憶體無疑就是犯罪。另一種辦法就是前面提到過的自動數組,這需要用到過程的概念和良好的程式設計結構。如果碰到有些數組需要作為全局變數在不同的過程中進行處理的情況,就只好採用開一個大數組的辦法來解決。為了更有效的利用電腦中的記憶體,Fortran90/95標準中正是引入了可分配數組的概念。通過ALLOCATE語句可以動態的創建可分配數組,使記憶體和對象可以在程式開始運行之後才建立起相互聯繫。9.5.3可分配數組的應用實例下麵的代碼實例演示了可分配數組在程式中的應用,以加深對可分配數組的理解。(詳細內容請參照本書)9.6數組賦值當數組配置好記憶體空間後,可以通過賦值語句或是數組構造器為數組中的元素進行賦值。Fortran語言中,數組的賦值可以通過賦值語句、DATA語句和數組構造器這三種手段來進行。9.6.1數組賦值語句首先介紹數組賦值語句。數組賦值語句是Fortran90/95標準中新增加的數組賦值手段。數組賦值語句的基本形式為:數組對象=value其中,數組對象代表數組名或數組片段,value表示數組運算式或者標量。當value為數組運算式時,必須和數組對象具有相同的形狀(即維數相同、每維長度相同,但上下界可以不同);當value大小為0或者是長度為0的字元型變數時,則沒有值賦給數組對象;當value為標量時,會把value處理成與數組對象相同的形狀,此時數組對象的每個元素均等於標量value的值。數組運算式中允許使用“+”、“-”、“*”、“/”、“**”等內部算術操作符。9.6.2數組構造器數組構造器是由括弧和斜線對之間的一系列數值組成,其一般形式為:數組名=(/取值列表/)其中,取值列表可以是標量,隱式DO迴圈或者任意秩的數組。取值列表中所有數值的類型都應該相同,數值之間以逗號分隔。如果取值列表中出現了數組,則它的值是按“列元素優先”的規則來賦給目標數組變數。數組構造器的標識“(/”和“/)”在書寫時要注意,括弧和撇號之間不能有空格。下麵來看一些實例。MN=(/1,3,5,7,9/) !標量表示AB=(/B(2,1:5),B(3:7,7:9)/) !數組表示CC=(/(I,I=1,4)/) !隱DO迴圈DE=(/10,A(2:7),(I,I=1,4),7/) !混合表示9.6.3DATA語句DATA語句從Fortran77時代開始就已經用於數組的賦值,只適用於數組初值的設置。本小節將介紹DATA語句進行數組賦值的基本用法。1.DATA語句賦值的特點同前面所述的兩種數組賦值語句不同的是,DATA語句允許直接對數組進行部分賦值,但此時編譯器一般會給出警告資訊,提示賦值數量不足。也就是說,在DATA語句中可以不要求數值的數量必須與被賦值數組的數組元素個數相同。被賦值數組中的數組元素按照“列元素優先”的原則“搶奪”數據段中的數據,一句話:先到先得。2.DATA語句的特殊性DATA語句是一種特殊的說明語句,與普通的說明語句有很大的不同。普通的說明語句必須放在說明段中,也就是必須放在可執行語句之前。但是DATA語句允許出現在程式單元結束語句END前的任意位置。由於DATA語句是在編譯期間就會執行的語句,因此,不管程式中出現多少條DATA語句,也不管DATA語句出現在什麼位置,同一個變數在程式執行前只允許有一個值。這個值以出現在程式中的最後一條DATA語句的賦值為准。這就是為什麼在本小節開始說DATA只適用於設置初值的緣故。9.7數組的輸入輸出在Fortran語言中,數組的操作方式非常豐富。其中,對數組的輸入/輸出操作即可以使用隱式DO迴圈來指定要進行輸入/輸出的每一維數組元素的起始位置、終止位置和步長增量,也可以直接給出要進行輸入/輸出的數組名、數組元素以及數組片段。下麵將分別進行講解。9.7.1一維數組的輸入輸出一維數組的輸入/輸出操作是數組操作中最簡單的情況,也是二維、三維乃至更高維數組輸入/輸出操作的基礎。只要掌握了一維數組的輸入/輸出操作方法,其他高維數組的輸入/輸出操作就很容易理解。由於一維數組在電腦記憶體中進行存儲時是線性排列的,因此輸入/輸出操作時,數據是按照數組給出的下標值依次進行輸入/輸出的。在對一維數組進行輸入/輸出操作時,即可以將整個數組作為輸入/輸出操作的對象,也可以只輸入/輸出數組中的一個元素、一個片斷。9.7.2二維數組的輸入輸出二維數組輸入/輸出操作的基礎就是一維數組的輸入/輸出操作,兩者沒有本質上的不同。數組元素輸入/輸出的順序是按照前面提到過的數組在電腦記憶體中的存儲順序來進行的。由於Fortran語言中數組的存放順序採用“列元素優先”的原則,因此在對二維數組進行輸入操作是,首先輸入的數據被數組中的第一列元素接收。比如要對一個的數組Array進行輸入,輸入語句“READ*,A”按下列順序將數據讀入給數組中的每個元素: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)按“列元素優先”的方式進行存貯的做法與數學上按行進行處理的習慣不太不一致,在進行輸入操作應該引起足夠的注意。給數組中各元素賦值時,應該先輸入第一列元素的值,再輸入第二列、第三列、……上元素的值,這樣才能確保電腦內接收到的矩陣是正確的。9.7.3其他高維數組的輸入輸出更高維數組的輸入輸出方式也是以一維數組的輸入輸出為基礎的。在輸入時,總是最低維上的下標值變化最快。例如一個2X2X2的三維數組Mx,在使用數組名進行系統默認的輸入操作時,讀入數據的先後次序如下: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)如果想要實現以“行元素優先”為規則進行輸入,則需要在輸入語句中交換隱式DO迴圈內外層迴圈變數的方法來實現。比如要實現數組Mx的“行元素優先”原則輸入,則可以使用下麵的輸入語句來實現:READ*,(((Array(I,J,K),K=1,2),J=1,2),I=1,2)9.8數組的運算數組之間的運算是Fortran語言獨步數值計算領域的一大絕活。當其他電腦語言還在使用DO迴圈、for迴圈或是其他形式的迴圈來為數組賦初值時,Fortran早已通過數組的整體賦值完成了這一工作,並開始了對數據的處理。當其他電腦語言好容易把一大票數據讀入到電腦之後,又開始用DO迴圈、for迴圈或是其他形式的迴圈將剛讀入的兩個巨型數組相加、相減以得到結果時,Fortran早已通過數組的算術運算完成了這些工作開始輸出結果了。數組間的運算是Fortran90/95標準中有利於數值計算的新手段。在Fortran77時代,數組間的運算也只能通過迴圈的手段來實現。在新的Fortran標準中,允許把整個數組或數組的一部分(即數組片段)作為一個獨立的對象進行相關的運算。前提是進行數組運算的兩個獨立對象應該是大小相同、形狀一致。在Fortran語言中,允許將數組或數組片斷作為運算對象的運算符包括:所有的算術運算符(包括“+”、“-”、“*”、“/”、“**”五種)所有的邏輯運算符(包括“.AND.”、“.OR.”、“.NOT.”、“.NEQV.”、“.EQV.
”五種)所有的關係運算符(包括“.LT.(<)”、“.LE.(<=)”、“.EQ.(=)”、“.NE.(/=)”“.GT.(>)”、“.GE.(>=)”六種)9.8.1算術運算在數組的算術運算運算式中,允許出現的對象包括數組、數組片斷、數組元素和標量。不同對象之間的運算有自身的特定規則和行為模式。1.算術運算的規則如果算術運算符兩側的運算對象都是數組或數組片斷,則要求兩個數組或數組片斷應該是大小相同、形狀一致的。運算在兩個數組或數組片斷對應位置上的數組元素間進行,保存結果的數組或數組片斷也應該和運算對象大小相同、形狀一致。2.算術運算的行為模式9.8.2邏輯運算在數組的邏輯運算運算式中,允許出現的對象包括數組、數組片斷、數組元素和標量。如果邏輯運算符兩側的運算對象都是數組或數組片斷,則要求兩個數組或數組片斷應該是大小相同、形狀一致的。運算在兩個數組或數組片斷對應位置上的數組元素間進行,保存結果的數組或數組片斷也應該和運算對象大小相同、形狀一致。如果邏輯運算符兩側的運算對象一個是數組或數組片斷,另一個是數組元素或標量,則運算在數組或數組片斷與數組元素或標量之間進行。保存結果的數組或數組片斷應該與參與運算的數組或數組片斷大小相同、形狀一致。9.8.3關係運算數組之間的關係運算在運算對象、運算規律上與數組的算術運算和邏輯運算沒什麼兩樣。假設數組A用於保存運算結果,數組B是雙目關係運算中的一個運算對象,C是另一個運算對象(可以是數組,也可以是可用於關係運算的其他標量),符號“&”表示任意一種關係運算符。則語句“A=B&C”類似於執行表所示的操作:數組的關係運算操作當C為數組時當C為標量時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常用內在函數Fortran語言中的內在函數通常都可以接受數組作為參數來進行運算,此外還有一些專用的函數適用於處理數組所特有的運算。本節就將介紹這些內在函數在數組領域的應用。9.9.1內部基本函數在Fortran語言的數組運算式中,允許將數組作為內部基本函數的參數。此時,內部基本函數的函數值就是一個同參數數組形狀相同的數組,它的每個位置上的元素值就是被運算元組對應位置上的數組元素取該基本函數所得的值。例如數組A和B都是形狀相同的一維數組,則語句B=SQRT(A)的執行結果可以表示如下:9.9.2矩陣乘積函數該函數的作用是執行數值型或邏輯型數組A與B的矩陣乘法。函數的原型為:C=MATMUL(A,B)使用時,數組A和B必須是秩為1或2(也就是一維或二維)的數值型或邏輯型的有值數組,且數組A和B中至少有一個的秩為2。傳入矩陣乘積函數的數組A與B的類型必須相同。數組A與B的矩陣乘積規則和結果與數學上的矩陣乘法定義一致,也就是說數組A的最後一維的長度必須和數組B的第一維的長度相同。結果數組C的秩和形狀取決於參數數組的秩和形狀:如果A的形狀為(n,m),B的形狀為(m,k),則結果數組C的秩為2,形狀為(n,k)。如果A的形狀為(m),B的形狀為(m,k),則結果數組C的秩為1,形狀為(k)。如果A的形狀為(n,m),B的形狀為(m),則結果數組C的秩為1,形狀為(n)。9.9.3向量點乘函數該函數的作用是執行數值型或邏輯型數組A與B的點積乘法。函數的原型為:C=DOT_PRODUCT(A,B)使用時,數組A和B必須是秩為1(即數學上所說的向量,也即一維數組)的數值型或邏輯型的有值數組,且數組A與B的類型必須相同。一維數組A與B點乘的結果是標量,函數的點乘規則和結果值與數學上的定義相同。如果一維數組A和B中有一個的長度為0,且數組為數值型數組,則結果為0;如果數組為邏輯型數組,則結果為.FALSE.。例如DOT_PRODUCT((/1,2,3/),(/3,4,5/))的結果為26,計算過程為(1x3)+(2x4)+(3x5))=26。9.9.4元素求和函數元素求和函數屬於數組規約函數中的一種。數組規約函數是一組功能類似的數組函數的統稱。這組函數的主要作用就是沿著數組中的某一維,對在遮罩運算式中值為.TRUE.的所有數組元素進行某種操作。這組函數包括SUM、PRODUCT、MAXVAL、MINVAL、COUNT、ANY和ALL函數。本節將主要介紹其中的兩種。元素求和函數的主要作用是沿著數組中的某一維,對在遮罩運算式中值為.TRUE.的所有元素求和。函數的原型為:C=SUM(A[,DIM][,MASK])9.9.5元素連乘求積函數該函數的主要作用是沿著數組中的某一維,對在遮罩運算式中值為.TRUE.的所有數組元素求連乘積。函數的原型為:C=PRODUCT(A[,DIM][,MASK])其中的注意事項和說明同元素求和函數。下麵是一些實例。比如數組A=(/2,4,6/),則PRODUCT(A)的值是48;又如PRODUCT(B,MASK=B<0.0)表示對數組B中的所有小於0的元素求連乘積。同元素求和函數一樣,結果C是數組還是標量也取決於函數中維的定義和被求積數組A的大小和形狀。比如數組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數組大小查詢函數該函數是數組查詢函數中的一種。數組查詢函數一組功能類似於數組函數的統稱。這組函數包括:SIZE、SHAPE、ALLOCATED、LBOUND和UBOUND函數。這裏只介紹其中的兩種:數組大小查詢函數和數組形狀查詢函數。數組大小查詢函數的作用是求數組沿著某一維的長度或者數組元素的總數目。函數原型為:C=SIZE(A[,DIM])其中A是被查詢數組,可以是假定大小數組,但不能是未定義的指針數組或未分配空間的可分配數組。當DIM等於1時,表示查詢數組有幾行;當DIM等於2時,表示查詢數組有幾列;當DIM被省略時,表示查詢數組有多大(即有多少個元素)。9.9.7數組形狀查詢函數該函數的功能就是求數組或標量的形狀。函數的原型為:C=SHAPE(A)其中,A表示被查詢對象,可以是標量或數組,但不能是假定大小數組、未定義的指針或未分配空間的可分配數組;C保存查詢結果,是一個一維整型數組。比如SHAPE(2)將返回一個零長度一維數組;如果對數組B(-2:5,9:10)進行查詢,則SHAPE(B)將返回一維數組(8,2)。9.9.8數組合並函數數組合並函數是數組構造函數中的一種。數組構造函數也是一系列功能相似的函數的總稱,它們用於從已有數組的元素構造出新數組。這組函數包括:MERGE、PACK,UNPACK和SPREAD函數。數組合並函數的只要用途就是在遮罩運算式的控制下,對兩個獨立數組進行合併操作。該函數的原型為:C=MERGE(TSOURCE,FSOURCE,MASK)其中,TSOURCE可以是任意類型的數組或標量,FSOURCE是必須與TSOURCE具有相同的類型和類型參數的數組或標量。遮罩運算式MASK必須是邏輯型數組;若MASK值為真,則結果是TSOURCE,若MASK值為假,則結果是FSOURCE。9.9.9數組壓縮函數:該函數的作用就是在遮罩運算式的控制下,將數組壓縮成向量數組。數組的原型為:C=PACK(A,MASK[,VECTOR])A表示被壓縮對象,可是任意類型的數組;遮罩運算式MASK必須是邏輯型數組,並且與數組A相容(也就是形狀相同);VECTOR是可選參數,必須為向量數組,並且與數組A具有相同的類型和類型參數。結果C是秩為1的數組(就是一維數組),其類型和類型參數與數組A相同。若VECTOR存在,則結果C的大小等於VECTOR的大小,否則其大小是使遮罩運算式MASK值為真的元素的個數;若遮罩運算式MASK為標量並且值為真,則結果C的大小與數組A相同。結果C中的值按數組中的元素位置排序,數組A中的第i個元素對應於遮罩運算式MASK的第i個為真元素。若VECTOR存在,且大小大n於符合條件的數組A中的元素個數t,則結果C中第i個元素值為VECTOR(i),i=t+1,…,n。9.9.10數組形狀擴展和重構形函數這是一個由兩個函數組成的函數族,包括SPREAD函數與RESHAPE函數,用於完成數組形狀重構和擴展的任務。SPREAD函數的主要功能就是將數組沿著某一維的方向拷貝規定次數後擴展成一個新的數組。函數的原型為:C=SPREAD(A,DIM,NCOPIES)其中,A為被拷貝對象,可以是標量或任意類型的數組。當DIM等於1時,表示沿著第一維下標變化的方向擴展,也稱為向下擴展;當DIM等於2時,表示沿著第二維下標變化方向擴展,也稱為向右擴展。NCOPIES用於指定拷貝的次數。9.9.11數組轉置函數數組轉置函數是數組運算函數中的一種。數組運算函數是數組函數中同矩陣運算相關的一組函數的總稱,這組函數包括:TRANSPOSE、EOSHIFT和CSHIFT三個函數。數組轉置函數的用途就是對秩為2的數組(就是二維數組)進行轉置操作。函數的原型為:C=TRANSPOSE(MATRIX)其中,數組MATRIX必須是一個二維數組。轉置後的結果數組C的形狀正好與數組MATRIX的形狀相反。也就是說MATRIX(n,m)轉置後的結果為C(m,n)。9.9.12去端移動函數該函數的作用是對秩為1的數組作去端移位處理,或
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度木材行业碳排放权交易合同8篇
- 二零二五版农村电商合作发展合同4篇
- 二零二五年度环保设施灭四害服务合同及环保标准协议4篇
- Preparing for Pregnancy助产专业资源库
- 水电安装工程2025年度工程监理合同2篇
- 2025版民间借贷教育基金担保合同示例3篇
- 2025年度生态环保项目投资担保合同书
- 2025年度离婚财产分割纠纷诉讼保全与执行全程服务合同2篇
- 二零二五年度水利工程内部施工合同4篇
- 2025年度个人别墅抵押借款合同范本5篇
- 乳腺癌的综合治疗及进展
- 【大学课件】基于BGP协议的IP黑名单分发系统
- 2025年八省联考高考语文试题真题解读及答案详解课件
- 信息安全意识培训课件
- 2024年山东省泰安市初中学业水平生物试题含答案
- 美的MBS精益管理体系
- 中国高血压防治指南(2024年修订版)解读课件
- 2024安全员知识考试题(全优)
- 2024年卫生资格(中初级)-中医外科学主治医师考试近5年真题集锦(频考类试题)带答案
- 中国大百科全书(第二版全32册)08
- 第六单元 中华民族的抗日战争 教学设计 2024-2025学年统编版八年级历史上册
评论
0/150
提交评论