行列の積 (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 作った。