[itbase2017]Fortran 実習 配列
配列
同じデータ型の値を複数まとめて一つの変数名で扱うための仕組みが「配列」です. 配列を使ってみましょう.
下のようなプログラムを vector.f90 というファイル名で作成しましょう.
program vector implicit none real :: dotprod real :: vectorA(3) ! 要素数 3 の実数型変数配列 (ベクトル A) integer, parameter :: nn = 3 ! 要素数を定数で定義 real :: vectorB(nn) ! 要素数 nn(=3) の実数型変数配列 (ベクトル B) vectorA(1) = 1.1 ! 配列への値の代入 vectorA(2) = -2.2 vectorA(3) = 3.3 vectorB(1) = -1.3 ! 配列への値の代入 vectorB(2) = -2.5 vectorB(3) = 0.7 dotprod = vectorA(1) * vectorB(1) & ! ベクトル A, B の内積の計算 + vectorA(2) * vectorB(2) & ! 行の最後に & を付けると次の行に続く + vectorA(3) * vectorB(3) ! "=" と "+" の位置を合わせる必要はない print *, "(", vectorA(1), ",", vectorA(2), ",", vectorA(3), ")" print *, "(", vectorB(1), ",", vectorB(2), ",", vectorB(3), ")" print *, "Dot product = ", dotprod vectorB = vectorA ! 配列要素すべての代入 ! ただし, 要素数が同じ配列同士でなければならない print *, vectorB ! 配列の要素すべての出力 end program vector
このプログラムは, 1 次元配列をベクトルに見立てて, 二つのベクトル A と B を用意し, それらの内積を 計算しています.
コンパイルして実行してみましょう.
$ gfortran -o vector vector.f90 <- コンパイル $ ./vector <- 実行 ( 1.10000002 , -2.20000005 , 3.29999995 ) ( -1.29999995 , -2.50000000 , 0.699999988 ) Dot product = 6.38000011 1.10000002 -2.20000005 3.29999995
プログラムの内容のいくつかの部分を説明しておきます.
上のプログラムでは, 配列をまず
real :: vectorA(3) <データ型> :: <変数名> ( <要素数> )
として宣言されています. この時, 配列の添え字は 1, 2, 3 となります.
しかし, より一般的には下のように宣言することができます.
<データ型> :: <変数名> ( <開始添え字> : <終了添え字> )
具体的には, 例えば,
real :: vectorA(11:13)
とせんげんすることができ, この時の配列の添え字は, 11, 12, 13 と なります. なお, 添え字には負またはゼロを使うこともできます.
また, 上のプログラムの例では,
integer, parameter :: nn = 3 real :: vectorB(nn)
といったように, 変数 nn を使った配列の宣言も示しています. このように変数を要素数に用いると, 要素数を変更したい際に, プログラムの変更箇所が少なくて済み大変便利です.
ただし, 変数を要素数に使った並列の宣言のためには, 要素数の変数 (上の nn) は「定数」でなければなりません. つまり, parameter 属性を付けた変数のみが要素数として受け 入れられます.
練習問題
上の例のプログラム vector.f90 を変更して, vectorA と vectorB で与えられる ベクトルの外積を計算するプログラムを作りなさい.
ヒントと答え:
- 結果を保持するための配列, 例えば vectorC(3), を用意する
- 外積の結果はベクトルです
- 外積を計算する
答え
Cross product = ( 6.71000004 , -5.05999994 , -5.61000013 )
多次元配列
詳しくは説明しませんが, 下のプログラムのように, 2 次元以上の多次元配列を使うこともできます.
program matrix2d implicit none integer, parameter :: mm = 2, nn = 3 ! 要素数を定数で定義 real :: matrix(mm,nn) ! 要素数 mm x nn の実数型変数配列 matrix(1,1) = 1.1 ! 配列への値の代入 matrix(1,2) = 1.2 matrix(1,3) = 1.3 matrix(2,1) = 2.1 matrix(2,2) = 2.2 matrix(2,3) = 2.3 print *, matrix ! 配列の要素すべての出力 print *, matrix(1,3) ! 要素一つの出力 end program matrix2d
多次元の数値データを扱うときには便利です. (例えば行列. 上のプログラムでは 2 x 3 の行列を表すことができます.)
Keyword(s):
References:[[itbase2017]惑星学実験実習の基礎II]