fortran的陣列定義

2022-02-16 11:25:50 字數 6380 閱讀 5702

1樓:許詩文

1.基本使用:

一維陣列:

datatype

name (size)

datatype:

integer, real, complex, logical,或type自定義出來的型別。

integer,

parameter :: students = 5

integer

:: student (students)

其他定義方法:

integer

a(10) !最簡單的

integer,

dimension (10) :: a !另外的方法

integer,

dimension (10) :: a,b,c !一起定義

integer

a !f77 先宣告a是整型,

dimension

a(10) !再宣告a是大小為10的陣列

或type

type

:: person

real ::height, weight

endtype

type

(person) :: a(10)

a(2)%height

= 180.0

二維陣列:

integer

a(3, 3)

a(1,1)

= 3定義方法:

integer

a(10,10)

integer,

dimension (10, 10) :: a,b,c

integer

adimension

a(10,10) ! f77, 先定義型別

二維陣列常用來當作矩陣使用。

多維陣列:

frotran最多可宣告高達七維的陣列。

integer

a(d1,d2,...,dn) !n維

一般說來,越高維陣列讀資料越慢。

另類宣告方法:

integer

a(5) 可使用的是a(1), a(2), a(3), a(4), a(5)

integer

a(0:5) 下標可使用的是0~5,a(0),a(1),...,a(5)六個元素。

integer

a(-3:3) 可以使用的是a(-3), a(-2), a(-1), a(0),...,a(3)七個元素。

integer

a (5,0:5) 可用a(1~5, 0~5)

integer

b(2:3, -1:3) 可用b(2~3, -1~3)

2.陣列內容的設定

賦初值:

integer

a(5)

data

a /1, 2, 3, 4, 5/

data

a /5*3/ !5個3 *表示資料重複

「隱含式」迴圈的功能設定初值:

integer

a(5)

integer

idata(a(i),i=2,4)

/2,3,4/ !a(2)=3,a(3)=3,a(4)=4

輸出:write

(*,*) (a(i), i=2, 4) 顯示a(2),a(3),a(4)

也可以設定累加值:

(a(i),i=2,10,2)

! 迴圈執行5次,i分別是2,4,6,8,10。

「隱含」選還可以多層巢狀:多維陣列

integer

a(2,2)

integer

i,jdata((a(i,j),

i=1,2),j=1,2) /1,2,3,4/

裡面的迴圈先執行,結果:

a(1,1)=1,

a(2,1)=2, a(1,2)=3, a(2,2)=4

f90中可以省掉data描述,直接設定初值:

integer

:: a(5) = (/1,2,3,4,5/) ! 注意:括號和除號之間不能有空格。

省掉 data直接把初值寫在宣告之後時,不能像data時那樣,用隱式迴圈對陣列中部分元素設初值,每個元素必須給定初值,而且寫法有點不同:

integer

:: i

integer

:: a(5) = (/ 1, (2, i=2,4), 5/)

!a(1)

= 1!a(2)=2,a(3)=2,

a(4)=2 !(2,i=2,4) 是隱式迴圈

!a(5)=5

f90中的隱式迴圈:

integer

:: a(5)= (/i, i=1,5/)

!a(1)=1,

a(2)=2, a(3)=3, a(4)=4, a(5)=5

3.對整個陣列的操作(陣列廣播)

a=5! a是任意維數的陣列,全部元素設為5

a=(/1,2,3/)

! 右邊數字數目應該和陣列的大小一樣

a=b!a,b同樣維數及大小的陣列,相同位置的元素賦給a

a=b+c!三個都是相同維數大小的陣列,相同位置的數字相加給a

a=b-c

a=b*c!注意不等於矩陣的相乘,a(i,j)=

b(i,j)*c(i,j)

a=b/c

a=sin(b) !a(i)=sin(b(i))

4. 對部分陣列的操作

a(3:5)

= 5a(3:)

= 5a(3:5)

= (/3,4,5/)

a(1:3)

= b(4:6)

a(1:10)

= a(10:1:-1) !使用隱含迴圈的方法將陣列a(1~10)的內容翻轉。

a(:)

= b(:, 2)

a(:,

:) = b(:, :, 1)

!拿陣列的一部分內容使用的時候,需要注意的原測:

(1)等號兩邊的陣列元素數目要一樣多。

(2)同時使用多個隱含迴圈的時候,較低維數迴圈可以看作是內層的迴圈。

5. where:

f95的新增功能,用來取出部分陣列的內容進行設定。where命令可以經過邏輯判斷來使用陣列的一部分。

example:

!把陣列a中小於3的元素值設定給b

where(a<3)

b=a !這裡a,b維數大小相等

endwhere

也可以寫成:

where

(a<3) b=a !與if相似

!where命令的**簡單,執行起來速度快。

!where是用來設定陣列的,所以它的模組中只能出現與設定陣列相關的命令,而且在它的整個程式模組中所使用的陣列變數,都必須是同樣維數大小的陣列。

還可以配合elsewhere來處理邏輯不成立的情況:

where

(a<3)

b=1elsewhere

b=2end

where

還可作多重判斷,只要elsewhere後接上邏輯判斷就行了:

where

(a<2)

b=1elsewhere(a>5)

b=2elsewhere

b=3end

where

可以巢狀的,跟迴圈一樣可以取名字,不過在end

where的時候一定要加上它的名字,用來明確要結束哪個where模組:

name:

where (a<5)

b=aend

where name

where(a<5)

where(a/=2)

b=3elsewhere

b=1end where

elsewhere

b=0end

where

6.forall:

f95新增

integer

iinteger

:: a(5)

forall

(i=1:5)

a(i)=5

endforall

forall(i=1:5)

a(i)=i

endforall

forall的詳細語法:

forall

(triplet1 [, triplet2 [, triplet3...]], mask)

........

endforall

tripletn是用來賦值陣列座標範圍的值。如forall

(i=1:5)中i=1:5 就是一個triplet。

integer

:: a(10, 5)

forall

(i=2:10:2, j=1:5)

a(i,j) = i+j

endforall

mask是用來作條件判斷的,跟where命令中使用的條件判斷類似,可以用來限制forall程式模組中只作用於陣列中符合條件的元素。還可以作其他限制。

forall

(i=1:5, j=1:5, a(i, j)<10 ) !只處理a中小於10的元素

a(i,j) = 1

endforall

forall

(i=1:5, j=1:5, i==j) !只處理i==j的元素

a(i,j) = 1

endforall

forall(i=1:5,

j=1:5, ((i>j) .and. a(i,j)>0))

!還可賦值好幾個條件,這裡只處理二維矩陣的上三角部分且a(i,j)>0的元素

a(i,j)=1/a(i,j)

endforall

如果只有一行**時候也可以省掉end

forall,寫在同一行:

forall

(i=1:5, j=1:5, a(i,j)/=0) a(i,j)=1/a(i,j)

forall

可以多層巢狀,裡面只能出現跟設定陣列數值相關的程式命令,還可以在forall中使用where。不過where中不可以使用forall。

forall

(i=1:5)

forall (j=1:5)

a(i,j) = 1

end forall

forall (j=6:10)

a(i,j) = 2

end forall

endforall

forall

(i=1:5)

where (a(:, i) /=0)

a(:, i) = 1.0/a(:, i)

end where

endforall

7. fortran 中陣列的儲存規則

不管陣列的形狀,它所有的元素都是分佈在記憶體中同一個連續的模組當中。

多維陣列在記憶體中的連續模組排列情況是以一種列優先的方法排列的,陣列存放在記憶體中的時候,會先放入第一個列中每個行的元素,然後再放入下一個列中每一行的元素。

exmaple:

a(1,1)->a(2,1)->a(3,1)=>a(1,2)->a(2,2)->a(3,2)=>a(1,3)->a(2,3)->a(3,3)

也即對多維陣列,會先放入維數的元素,再放入較高維數的元素。

陣列元素位置的計算:

一個n維陣列a(d1,d2,...,dn)

設: sn=d1*d2*...*dn

則a(d1,d2,d3,...,dn)在第1+(d1-1)+(d2-1)*s1+

... +(dn-1)*sn-1個位置。

使用陣列時候最好用低維的下標作為內迴圈,這樣比較快。

8.可變大小的陣列:(allocate,

allocatable, deallocate)

integer

:: students, error = 0

integer

,allocatable :: a(:) !定義a是可變大小的陣列

...read(*,*)

students

allocate(a(students),

stat=error) ! or allocate(a(students)) !申請陣列記憶體空間

...deallocate(a) !釋放動態陣列佔用的記憶體空間

多維陣列:

integer,

allocatable :: a2(:, :)

integer,

allocatable :: a3(:, :, :)

allocate(a2(5,

5))allocate(a3(5,

5, 5))

或allocate(a2(-3:3,

-3:3))

相關的函式allocated可用來檢查一個可變大小的陣列是否已經配置記憶體來使用,會返回一個邏輯值。

example:

if(.not.

allocated(a)) then

allocate(a(5))

endif

怎麼判斷陣列的定義是否合法,合法的陣列定義是()

定義陣列的時候,由於需要給陣列分配記憶體空間,且是靜態分配,即在程式連結之前就要分配,那麼陣列的大小必須是確定的一個常量n。只要這個n是常量,且陣列名稱是合法的識別符號,則陣列定義就是合法的。is array array 判斷一個變數是否是一個陣列 合法的陣列定義是 選d。a選項中陣列型別定義錯誤,...

C語言程式設計中陣列的定義,c語言陣列的定義

這種題目一般不希望設計記憶體管理。所以一般都是進可能給一個比較大的陣列。例如a 10 表示位數不會超過十,你輸入的時候需要個索引記錄a陣列有效的位數。使用的時候,只使用有效位數。肯定會有一段記憶體不用的。或多或少。這就是陣列儲存動態資料特點。如果記憶體管理的話,你設計個增量比如5.一旦索引告訴你10...

Fortran計算n行n列二維陣列的兩個對角線上各元素之和

include using namespace std int main int num cout 請輸入對角矩陣的大小 endl cin num int p new int num 陣列大小動態,二維 for int i 0 i p i new int num int sum 0 int numb...