mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages
※2018年9月15日より非力な環境でサーバを運用しているため、各ページの表示に時間がかかる場合があります。ご了承ください。(改良の予定あり)

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Fortran - 行列とベクトルの積の計算!

[ プログラミング, 数学 ] [ Fortran ]

こんばんは。

Fortran 95 で行列とベクトルの積を計算してみました。

0. 前提条件

  • LMDE 3 (Linux Mint Debian Edition 3; 64bit) での作業を想定。
  • GCC 6.3.0 (GFortran 6.3.0) でのコンパイルを想定。

1. ソースコードの作成

  • 組み込み関数を使用しない場合は、使用する場合の方をコメントアウト、使用しない場合の方をコメント解除すること。
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. ソースコードのコンパイル

1
$ gfortran -o mv_product mv_product.f95

3. 動作確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ ./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

もしくは、以下のようなテキストファイルを用意し、そのファイルを読み込ませる。

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
1
2
3
4
5
$ ./mv_product < mv.dat
 Input a dimension:
 Input a vector:
 Input a matrix:
  -1.0000000000000000        34.000000000000000        7.0000000000000000       13.000000000000000

以上、

プログラミング, 数学 Fortran



« Fortran - 内積の計算! Fortran - 最大公約数の計算! »

Comments