Fortran90(行列)

行列計算します。まずは行列の和から。
配列代入を使えば簡単です。

takk@deb9:~$ cat matrix-sum.f90
      program main
        integer a(2,2),b(2,2),c(2,2)
        data a /1,2, 3,4/
        data b /10,20, 30,40/

        write(*,*) 'a='
        write(*,*) (a(1,i),i=1,2)
        write(*,*) (a(2,i),i=1,2)

        write(*,*) 'b='
        write(*,*) (b(1,i),i=1,2)
        write(*,*) (b(2,i),i=1,2)

        c = a + b

        write(*,*) 'c=a+b'
        write(*,*) (c(1,i),i=1,2)
        write(*,*) (c(2,i),i=1,2)

        stop
      end
takk@deb9:~$

引き算も同じ要領です。

takk@deb9:~$ cat matrix-sub.f90
      program main
        integer a(2,2),b(2,2),c(2,2)
        data a /11,22, 33,44/
        data b /10,20, 30,40/

        write(*,*) 'a='
        write(*,*) (a(1,i),i=1,2)
        write(*,*) (a(2,i),i=1,2)

        write(*,*) 'b='
        write(*,*) (b(1,i),i=1,2)
        write(*,*) (b(2,i),i=1,2)
        c = a - b

        write(*,*) 'c=a-b'
        write(*,*) (c(1,i),i=1,2)
        write(*,*) (c(2,i),i=1,2)

        stop
      end
takk@deb9:~$ gfortran matrix-sub.f90
takk@deb9:~$ ./a.out
 a=
          11          33
          22          44
 b=
          10          30
          20          40
 c=a-b
           1           3
           2           4
takk@deb9:~$

では積はどうでしょう。a * bだけで済むのでしょうか。

takk@deb9:~$ cat matrix-mul.f90
      program main
        integer a(2,2),b(2,2),c(2,2)
        data a /1,2, 3,4/
        data b /10,20, 30,40/

        write(*,*) 'a='
        write(*,*) (a(1,i),i=1,2)
        write(*,*) (a(2,i),i=1,2)

        write(*,*) 'b='
        write(*,*) (b(1,i),i=1,2)
        write(*,*) (b(2,i),i=1,2)
        c = a * b

        write(*,*) 'c=a*b'
        write(*,*) (c(1,i),i=1,2)
        write(*,*) (c(2,i),i=1,2)

        stop
      end
takk@deb9:~$ gfortran matrix-mul.f90
takk@deb9:~$ ./a.out
 a=
           1           3
           2           4
 b=
          10          30
          20          40
 c=a*b
          10          90
          40         160
takk@deb9:~$

配列の要素どうしの積になってしまいました。
このような計算をしてほしかったのですが、配列代入だけではできないようです。
\[
\left(
\begin{array}{cc}
a1 & a2 \\
a3 & a4
\end{array}
\right)
\times \left(
\begin{array}{cc}
b1 & b2 \\
b3 & b4
\end{array}
\right)
= \left(
\begin{array}{cc}
a1 \times b1 + a2 \times b3 & a1 \times b2 + a2 \times b4 \\
a3 \times b1 + a4 \times b3 & a3 \times b2 + a4 \times b4
\end{array}
\right)
\]

次回は、この行列の積を作ってみます。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA