.................. program 18 .................. C 行列とベクトルの掛け算 program main parameter(NN=2) real*8 a(NN,NN),x(NN),y(NN) C 行列に値をいれる(値自身は意味ないです) call m_input(a,NN) C ベクトルに値をいれる call v_input(x,NN) C y=a*xを計算 call m_times_v(a,x,y,NN) C 出力 write(*,*)"matrix a:" call m_output(a,NN) write(*,*)"vector x:" call v_output(x,NN) write(*,*)"vector y=ax:" call v_output(y,NN) end C ベクトルw = 行列m * ベクトルv を計算するサブルーチン subroutine m_times_v(m,v,w,n) real*8 m(n,n),v(n),w(n) C ベクトルwを初期化(値を0に) do i=1,n w(i)=0 enddo C m*vによりwを求める do i=1,n do j=1,n w(i)=w(i)+m(i,j)*v(j) enddo enddo end C ベクトル(一次元配列)の値をキーボード(またはファイル) C から読み込むサブルーチン subroutine v_input(v,n) real*8 v(n) read(*,*)(v(i),i=1,n) end C 行列(二次元配列)の値をキーボード(またはファイル) C から読み込むサブルーチン subroutine m_input(m,n) real*8 m(n,n) do i=1,n read(*,*)(m(i,j),j=1,n) enddo end C ベクトル(一次元配列)の値を出力するサブルーチン subroutine v_output(v,n) real*8 v(n) write(*,*)(v(i),i=1,n) end C 行列(二次元配列)の値を出力するサブルーチン subroutine m_output(m,n) real*8 m(n,n) do i=1,n write(*,*)(m(i,j),j=1,n) enddo end .................. program 19 .................. C 行列同士の掛け算 C program 8を書き換える。 C 新しく作るサブルーチンは掛け算部分だけ。 C 行列への入力や出力はprogram 18で作ったサブルーチンを使う。 C program 18からm_inputとm_outputをコピーして、このプログラムの C 最後につけてください program main parameter(NN=2) real*8 a(NN,NN),b(NN,NN),c(NN,NN) C 行列に値をいれる call m_input(a,NN) call m_input(b,NN) C c=a*bを計算 call m_times_m(a,b,c,NN) C 出力 write(*,*)"matrix a:" call m_output(a,NN) write(*,*)"matrix b:" call m_output(b,NN) write(*,*)"matrix c=a*b:" call m_output(c,NN) end C 行列m3 = 行列m1 * 行列m2 を計算するサブルーチン subroutine m_times_m(m1,m2,m3,n) real*8 m1(n,n),m2(n,n),m3(n,n) C m3を初期化(値を0に) do i=1,n do j=1,n m3(i,j)=0 enddo enddo C m1*m2によりm3を求める do i=1,n do j=1,n do k=1,n m3(i,j)=m3(i,j)+m1(i,k)*m2(k,j) enddo enddo enddo end