[itbase2017]Fortran 実習 配列

配列

同じデータ型の値を複数まとめて一つの変数名で扱うための仕組みが「配列」です. 配列を使ってみましょう.

下のようなプログラムを vector.f90 というファイル名で作成しましょう.

program vector

  implicit none

  real :: dotprod
  real :: vectorA(3)                ! 要素数 3 の実数型変数配列 (ベクトル A)

  integer, parameter :: nn = 3      ! 要素数を定数で定義
  real               :: vectorB(nn) ! 要素数 nn(=3) の実数型変数配列 (ベクトル B)

  vectorA(1) =  1.1                    ! 配列への値の代入
  vectorA(2) = -2.2
  vectorA(3) =  3.3
  vectorB(1) = -1.3                   ! 配列への値の代入
  vectorB(2) = -2.5
  vectorB(3) =  0.7

  dotprod = vectorA(1) * vectorB(1) &  ! ベクトル A, B の内積の計算
          + vectorA(2) * vectorB(2) &  ! 行の最後に & を付けると次の行に続く
          + vectorA(3) * vectorB(3)    ! "=" と "+" の位置を合わせる必要はない

  print *, "(", vectorA(1), ",", vectorA(2), ",", vectorA(3), ")"
  print *, "(", vectorB(1), ",", vectorB(2), ",", vectorB(3), ")"
  print *, "Dot product = ", dotprod

  vectorB = vectorA        ! 配列要素すべての代入
                           ! ただし, 要素数が同じ配列同士でなければならない

  print *, vectorB         ! 配列の要素すべての出力

end program vector

このプログラムは, 1 次元配列をベクトルに見立てて, 二つのベクトル A と B を用意し, それらの内積を 計算しています.

コンパイルして実行してみましょう.

$ gfortran -o vector vector.f90               <- コンパイル
$ ./vector                                   <- 実行
 (   1.10000002     ,  -2.20000005     ,   3.29999995     )
 (  -1.29999995     ,  -2.50000000     ,  0.699999988     )
 Dot product =    6.38000011
   1.10000002      -2.20000005       3.29999995

プログラムの内容のいくつかの部分を説明しておきます.

上のプログラムでは, 配列をまず

real :: vectorA(3)

<データ型> :: <変数名> ( <要素数> )

として宣言されています. この時, 配列の添え字は 1, 2, 3 となります.

しかし, より一般的には下のように宣言することができます.

<データ型> :: <変数名> ( <開始添え字> : <終了添え字> )

具体的には, 例えば,

real :: vectorA(11:13)

とせんげんすることができ, この時の配列の添え字は, 11, 12, 13 と なります. なお, 添え字には負またはゼロを使うこともできます.

また, 上のプログラムの例では,

integer, parameter :: nn = 3
real               :: vectorB(nn)

といったように, 変数 nn を使った配列の宣言も示しています. このように変数を要素数に用いると, 要素数を変更したい際に, プログラムの変更箇所が少なくて済み大変便利です.

ただし, 変数を要素数に使った並列の宣言のためには, 要素数の変数 (上の nn) は「定数」でなければなりません. つまり, parameter 属性を付けた変数のみが要素数として受け 入れられます.

練習問題

上の例のプログラム vector.f90 を変更して, vectorA と vectorB で与えられる ベクトルの外積を計算するプログラムを作りなさい.

ヒントと答え:

  • 結果を保持するための配列, 例えば vectorC(3), を用意する
    • 外積の結果はベクトルです
  • 外積を計算する
  • 答え

    Cross product = (   6.71000004     ,  -5.05999994     ,  -5.61000013     )

多次元配列

詳しくは説明しませんが, 下のプログラムのように, 2 次元以上の多次元配列を使うこともできます.

program matrix2d

  implicit none

  integer, parameter :: mm = 2, nn = 3   ! 要素数を定数で定義
  real               :: matrix(mm,nn)    ! 要素数 mm x nn の実数型変数配列

  matrix(1,1) = 1.1                    ! 配列への値の代入
  matrix(1,2) = 1.2
  matrix(1,3) = 1.3
  matrix(2,1) = 2.1
  matrix(2,2) = 2.2
  matrix(2,3) = 2.3

  print *, matrix                  ! 配列の要素すべての出力
  print *, matrix(1,3)             ! 要素一つの出力

end program matrix2d

多次元の数値データを扱うときには便利です. (例えば行列. 上のプログラムでは 2 x 3 の行列を表すことができます.)

Last modified:2017/10/24 12:49:13
Keyword(s):
References:[[itbase2017]惑星学実験実習の基礎II]