Fortran - 内積の計算!
Updated:
Fortran 95 でベクトルの内積を計算してみました。
0. 前提条件
- LMDE 3 (Linux Mint Debian Edition 3; 64bit) での作業を想定。
- GCC 6.3.0 (GFortran 6.3.0) でのコンパイルを想定。
1. ソースコードの作成
- 組み込み関数を使用しない場合は、使用する場合の方をコメントアウト、使用しない場合の方をコメント解除すること。
File: inner_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
!****************************************************
! ベクトルの内積を計算
!
! date name version
! 2018.08.14 mk-mode.com 1.00 新規作成
!
! Copyright(C) 2018 mk-mode.com All Rights Reserved.
!****************************************************
!
program inner_product
implicit none
integer :: i, dim
real(kind=8), allocatable :: v1(:), v2(:)
real(kind=8) :: tmp
write (*,*) 'Input dimension:'
read (*,*) dim
allocate(v1(dim), v2(dim)) ! メモリ確保
write (*,*) 'Input vector 1:'
read (*,*) v1(1:dim)
write (*,*) 'Input vector 2:'
read (*,*) v2(1:dim)
! 組み込み関数を使用しない場合
! tmp = 0
! do i = 1, dim
! tmp = tmp + v1(i) * v2(i)
! end do
!
! 組み込み関数を使用する場合
tmp = dot_product(v1, v2)
write (*,*) 'Inner product of v1 and v2 = ', tmp
deallocate(v1, v2) ! メモリ解放
stop
end program inner_product
以下は、上記のコードをより Fortran らしく改良したもの。
(組み込み関数をしない場合と使用する場合の2通りで計算。ベクトルはコード内に記述。内積計算部分を関数化)
File: inner_product_2.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
!****************************************************
! ベクトルの内積を計算(Ver.2)
!
! date name version
! 2018.08.20 mk-mode.com 1.00 新規作成
!
! Copyright(C) 2018 mk-mode.com All Rights Reserved.
!****************************************************
!
program inner_product_2
implicit none
integer, parameter :: n = 3
real(8) :: x(n) = (/ 1, 2, 3 /)
real(8) :: y(n) = (/ 4, 5, 6 /)
write (*,*) iprod(n, x, y)
write (*,*) dot_product(x, y) ! 組み込み関数で検算
stop
contains
! 内積計算
!
! :param(in) integer(4) dim
! :param(in) real(8) x(dim)
! :param(in) real(8) y(dim)
! :return real(8)
real(8) function iprod(dim, x, y)
implicit none
integer, intent(IN) :: dim
real(8), intent(IN) :: x(dim), y(dim)
integer :: i
iprod = 0
do i = 1, dim
iprod = iprod + x(i) * y(i)
enddo
return
end function iprod
end program inner_product_2
2. ソースコードのコンパイル
$ gfortran -o inner_product inner_product.f95
$ gfortran -o inner_product_2 inner_product_2.f95
3. 動作確認
$ ./inner_product
Input dimension:
3
Input vector 1:
1
2
3
Input vector 2:
4
5
6
Inner product of v1 and v2 = 32.000000000000000
$ ./inner_product_2
32.000000000000000
32.000000000000000
以上、
Comments