物理学特別講義V （物理情報処理論） No.9

平成 11 年 6 月 16 日

1 行列の計算（積）

l 行 m 列の行列 A と m 行 n 列の行列の積を考える。

C_{i,j} = ∑_{k=1}^{m} A_{i,k}B_{k,j}  (1)

を計算すれば良い。これをプログラムの形で書くと、

parameter (NSIZE=10)
dimension A(NSIZE,NSIZE), B(NSIZE,NSIZE), C(NSIZE,NSIZE)
C
read(*,*) L,M,N
do i=1,L
  do j=1,N
    C(i,j)=0.0
    do k=1,M
      C(i,j)= C(i,j) + A(i,k)* B(k,j)
    end do
  end do
end do
C
end

と言ったものになる。各自このプログラムを作り、入出力の機能をつけて、テストしてみよ。

2 Fortran 文法

2.1 parameter 文、名前つき定数

配列の大きさを後で変更する時に、宣言文は必ず実行文の前にならなくてはならないので、実行文での変更はできない。しかし parameter 文（宣言文の前でも後でも良い）で名前つき定数を与えることでその機能の 1 部を果たせる。上の例では配列の大きさを parameter 文で定数として与えた。こうしておくと、一箇所書き換えるだけで良い。また、名前つき定数は宣言文以外のところで変更されることがないので、ミスを防ぐことができる。

2.2 入出力の do 形反復

最初の行列の積のプログラムでは、入出力の部分がなかった。これは read,write 文と do 文を組み合わせても良いが、もっと簡潔に以下のようにできる。

read(*,*) ((A(i,j), j=1,M), i=1,L)
read(*,*) ((B(i,j), j=1,N), i=1,M)
write(*,*) ((A(i,j), j=1,M), i=1,L)
write(*,*) ((B(i,j), j=1,N), i=1,M)
write(*,*) ((C(i,j), j=1,N), i=1,L)