Fortran - 行列とベクトルの積の計算!
Updated:
Fortran 95 で行列とベクトルの積を計算してみました。
0. 前提条件
- LMDE 3 (Linux Mint Debian Edition 3; 64bit) での作業を想定。
- GCC 6.3.0 (GFortran 6.3.0) でのコンパイルを想定。
1. ソースコードの作成
- 組み込み関数を使用しない場合は、使用する場合の方をコメントアウト、使用しない場合の方をコメント解除すること。
File: mv_product.f95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
!****************************************************
! 行列とベクトルの積を計算
! : y = A x
!
! date name version
! 2018.08.15 mk-mode.com 1.00 新規作成
!
! Copyright(C) 2018 mk-mode.com All Rights Reserved.
!****************************************************
!
program mv_product
implicit none
integer :: i, j, n
integer, parameter :: nmax = 100
real(kind=8) :: a(nmax, nmax), x(nmax), y(nmax), tmp
write (*,*) 'Input a dimension:'
read (*,*) n
write (*,*) 'Input a vector:'
read (*,*) (x(i), i = 1, n)
write (*,*) 'Input a matrix:'
do i = 1, n
read (*,*) (a(i, j), j = 1, n)
end do
! 組み込み関数を使用しない場合
!do i = 1, n
! tmp = 0
! do j = 1, n
! tmp = tmp + a(i, j) * x(j)
! end do
! y(i) = tmp
!end do
!
! 組み込み関数を使用する場合
y(1:n) = matmul(a(1:n, 1:n), x(1:n))
write (*,*) (y(i), i = 1, n)
stop
end program mv_product
2. ソースコードのコンパイル
$ gfortran -o mv_product mv_product.f95
3. 動作確認
$ ./mv_product
Input a dimension:
3
Input a vector:
1
2
3
Input a matrix:
1
2
3
4
5
6
7
8
9
14.000000000000000 32.000000000000000 50.000000000000000
もしくは、以下のようなテキストファイルを用意し、そのファイルを読み込ませる。
File: mv.dat
1
2
3
4
5
6
4
1.0 -2.0 3.0 4.0
2.0 1.0 -3.0 2.0
3.0 4.0 5.0 6.0
-1.0 2.0 0.0 3.0
2.0 -6.0 -7.0 5.0
$ ./mv_product < mv.dat
Input a dimension:
Input a vector:
Input a matrix:
-1.0000000000000000 34.000000000000000 7.0000000000000000 13.000000000000000
以上、
Comments