配列に初期値を代入しておくには,data文を用いるやりかたと,配列式を用いるやりかたがある.すべての要素に同じ値を代入するときは,配列式が便利である.部分的に異なる値を代入しておく場合は,data文を用いる.
初期値を設定する場合は,コロンを二つ(::)挿入する.
double precision :: a = 1.D0
配列にも初期値を格納できる.コロンを使用した書き方だと,全て同じ数が全要素に格納される.
例:implicit none integer i,j double precision :: a(3,3) = 1.D0 do i=1,3 write(*,*) (a(i,j),j=1,3) enddo end
配列の要素に別々の値を代入しておきたい場合は,data文が便利である.
implicit none integer i,j double precision a(3,3) data a /4*5.D0, 5*3.D0/ do i=1,3 write(*,*) (a(i,j),j=1,3) enddo end
4*5.D0と書くと,始めの4つの要素に5.D0を代入する.引き続いて5*3.D0で残りの5つの要素に3.D0が代入される.上の例で,どの要素に5.D0が,どの要素に3.D0が格納されているか注意すること.また,変数や配列の要素の数と,定数の数が異なるとエラーになるので注意すること.
配列を用いて式を記述することができる.要素の数が同じであれば,加減乗除が可能.しかし,各要素についての演算を行うだけなので,次節で取り扱う通常の意味での行列の積にはなっていないので注意.
例:implicit none integer i,j double precision a(3,3),b(3,3),c(3,3) a=1.D0 b=2.D0 c=a+b do i=1,3 write(*,*) (c(i,j),j=1,3) enddo write(*,*) c=a*b do i=1,3 write(*,*) (c(i,j),j=1,3) enddo write(*,*) c=a/b do i=1,3 write(*,*) (c(i,j),j=1,3) enddo end
上の例では,配列a,bの全ての要素に1.D0と2.D0がそれぞれ代入され,配列の要素ごとに足し算,掛け算,割り算が行われる.通常の意味での行列の積や逆行列との積とはまったく異なるので注意すること.
例えば,3×3の行列Aと,3次元ベクトルBの積を考える.この積はベクトルであり,それをCとする.数式で書くと以下になる.
![]() |
(1) |
式通りにプログラムを書くと次になる.実行する前に,手で計算すること.
implicit none double precision c(3),a(3,3),b(3) integer i,j data b/1.D0, 2.D0, 3.D0/, a/3*1.D0, 3*2.D0, 3*3.D0/ c = 0.D0 do i = 1, 3 do j = 1, 3 c(i) = c(i) + a( i, j ) * b(j) enddo write(*,*) i, c(i) enddo end
先ほどの例と同様に,行列AとBとの積を考える.この結果は行列となり,それをCとすると次の式になる.この式を参考に行列の掛け算を行う.
![]() |
(2) |
2.D0 3.D0 4.D0 5.D0 6.D0 7.D0 8.D0 9.D0 10.D0B.dat (行列B)
1.D0 2.D0 3.D0 4.D0 5.D0 6.D0 2.D0 4.D0 6.D0上の二つの3行3列の行列をそれぞれ A.dat,B.dat とする.