陣列操作 from《FORTRAN95 程式設計》

2021-08-17 03:44:26 字數 2838 閱讀 6955

1、數值賦初值操作:

例子:

integer a(5)

data a /1,2,3,4,5/ !fortran77 通常用法

或者integer a(5)

integer i

data (a(i),i=2,4) /2,3,4/ !用隱含式的迴圈將 a(2)=2,a(3)=3,a(4)=4賦值。

下面用fortran95的用法賦值,例子如下:

integer::a(5)=(/1,2,3,4,5/)
直接將陣列a的5個元素賦值,注意:省略data直接把初始值寫在宣告語句後面時候,每個元素都必須賦值,因此簡單的做法是用隱含式do迴圈完成,另外就是乾脆把陣列的全部元素都用乙個相同值來賦值。例如下面:

integer::a(5)=1                  !a(1)=a(2)=a(3)=a(4)=(5)=5

或者integer::i

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

2、對部分陣列的操作: fortran90為我們提供了一次只挑出部分陣列來操作的功能,這一功能的實現類似於隱含式的迴圈操作,下面用如下幾個例子來說明:

a(3:5)=5                    !a(3)=a(4)=a(5)=5,其他元素值不變

a(3:)=5 !把a(3)以後的元素的值都賦值成5,a(1)和a(2)不變,

a(1:3)=b(4:6) !a(1)=b(4),a(2)=b(5),a(3)=b(6)

a(1:10)=a(10:1:-1) !將a(1~10)的內容給翻轉過來儲存a中

a(:,:)=b(:,:,1) !要保證三維陣列b中的二維陣列全部元素對應的賦值給二維陣列a中

要注意的是多個隱含式迴圈,較低維的迴圈對應是內層迴圈,而且必須保證賦值符號兩側的陣列元素是同樣數目,如下面的例子:

integer::a(2,2),b(2,2)

b=a(2:1:-1,2:1,:-1) !相當於 b(1,1)=a(2,2);b(2,1)=a(1,2);b(1,2)=a(2,1);

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

3、應用where對部分陣列操作

where是fortran95新加入的功能,類似於if的功能,使用它可以使得程式精簡化,但是他的使用同樣要保證兩個陣列質檢的維數和大小是相同的。例如a和b都是一維陣列而且都是含有5個元素的,那麼下面:

where(a<3)

b=1elsewhere

b=2endwhere !用a陣列對應位置內容的大小來給b陣列賦值

4、forall 對部分陣列操作

forall是fortran95新加入的功能,但是這個功能更為強大,例如:

integer::a(10,5)

integer::i,j

......

......

forall(i=1:5,j=1:5,a(i,j)<10) !只處理陣列小標在1~5範圍而且元素內容小於10的元素

a(i,j)=1

end forall

同樣的,與if、where相似的地方是,只有一行**時候,可以省略end forall。

另外在forall中可以使用where。

5、陣列在記憶體中的儲存規則

fortran程式的陣列元素在記憶體中按列儲存,用二維陣列a(3,4)來說明它在記憶體中的儲存:

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)

--->>a(1,4)->a(2,4)->a(3,4) 最後儲存第四列

值得注意的是現在的計算機硬體結構中,會應用快取記憶體cache,當cpu使用資料時會先檢查快取記憶體中有沒有這個資料,當沒有時才會到儲存器中拿資料,在拿資料的時候,不僅會拿所需的資料同時也會拿臨近的資料,並把這列臨近的資料儲存在快取記憶體中,如有cpu之後馬上用到這些臨近的資料會直接向快取記憶體讀取,這使得線性計算機的計算速度變得快,因此我們應該利用這個規則來安排資料的存放。

6、可變大小的陣列

fortran90比fortran77功能強大的一點在於可以支援可變大小的陣列,寫法如下:

program ex0716

implicit none

integer::students

integer,allocatable::a(:)  !宣告乙個可變大小的陣列
integer::i

write(*,*) "how many students"

read(*,*)students

allocate(a(students)) !配置記憶體空間

......
end
另外釋放空間可用deallocate。

當我們要檢查乙個變數是否已經被配置過記憶體空間時,可以用allocated函式,該函式返回乙個邏輯值

if(.not.allocated(a)) then

allocate(a(5))

end if

陣列及陣列操作

c語言是在組合語言的基礎上就行的抽象,所以在理解c語言程式時,務必要以記憶體為基礎進行理解。關於陣列,只是同種型別資料的記憶體使用方式,除了在與指標連用時的語法比較繁瑣,其他都比較簡單。1 定義 初始化 使用 結合指標使用時,就要把它當做位址了 2 使用的情況 當儲存多個相同型別的資料時,可以使用陣...

ruby 陣列操作

陣列的建立 arr array.new num 建立num個元素的陣列,所有陣列元素為nil arr array.new num,elem 建立num個元素的陣列,所有陣列元素為elem arr array m.n 建立m.n元素為m到n的陣列 包括n m.n不包括n arr array elem1...

Jquery 陣列操作

在jquery中處理json陣列的情況中遍歷用到的比較多,但是用新增移除這些好像不是太多。今天試過json i remove json.remove i 之後都不行,看網頁的dom物件中好像json資料是以陣列的形式出現的,查閱了下相關js中陣列的操作一試果然很爽。記錄下來。1 陣列的建立 var ...