IT pass HikiWiki - [itbase2017]Fortran 実習 配列 Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
= 配列
同じデータ型の値を複数まとめて一つの変数名で扱うための仕組みが「配列」です.
配列を使ってみましょう.
下のようなプログラムを 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-2.2
vectorA(3) = 3.3
vectorB(1) =-1.1 -1.3 ! 配列への値の代入
vectorB(2) =-2.2-2.5
vectorB(3) =-3.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 -2.20000005 , 3.29999995 )
(-1.10000002 -1.29999995 , -2.20000005 -2.50000000 , -3.29999995 0.699999988 )
Inner
Dot product = -16.9400005
6.38000011
1.10000002 2.20000005 -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 の行列を表すことができます.)
同じデータ型の値を複数まとめて一つの変数名で扱うための仕組みが「配列」です.
配列を使ってみましょう.
下のようなプログラムを 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) =
vectorA(3) = 3.3
vectorB(1) =
vectorB(2) =
vectorB(3) =
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 <- 実行
(
Inner
Dot product =
1.10000002
プログラムの内容のいくつかの部分を説明しておきます.
上のプログラムでは, 配列をまず
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 の行列を表すことができます.)