行列の積 (Fortran 90)

matmul を使うのが正解。例えばこんなコードを書いてみればわかる。

program test_matmul
  implicit none
  integer :: l
  !! 一気に初期化。http://www.nag-j.co.jp/fortran/FI_12.html を参照
  real(8) :: mat(3,3) = reshape( (/1.0d0, 2.0d0, 3.0d0, 4.0d0, 5.0d0, 6.0d0, 7.0d0, 8.0d0, 9.0d0/), shape(mat) )
  real(8) :: vec1(3) = (/-3.0d0, -2.0d0, -1.0d0/)
  real(8) :: vec2(3)
  
  !! reshape では列の方向に配置されてしまうので、転置して 1, 2, 3 // 4, 5, 6 // 7, 8, 9 の形に戻す
  mat = transpose( mat )
  
  !! 要素を個別に計算
  do l=1,3
    vec2(l) = &
      &  mat(l,1)*vec1(1) &
      & +mat(l,2)*vec1(2) &
      & +mat(l,3)*vec1(3)
  enddo
  do l=1,3
    write(*,"(2x,'vec2(',i1,') = ',f9.4)") l, vec2(l)
  enddo
  
  !! matmul 利用
  vec2 = matmul( mat, vec1 )
  do l=1,3
    write(*,"(2x,'vec2(',i1,') = ',f9.4)") l, vec2(l)
  enddo
  
  stop
endprogram test_matmul

いや、アタリマエなんだけど、なぜか昔の自分がたまに matmul を使ってなかったので、一応メモ。

あと内積は dot_product ね。inner_product とか scalar_product ではない。それと cross_product とか outer_product はなかったので、自分で function 作った。