Fortran-arrays
Fortran-配列
配列は、同じタイプの要素の固定サイズの順次コレクションを格納できます。 配列はデータのコレクションを格納するために使用されますが、配列を同じタイプの変数のコレクションと考える方が便利な場合がよくあります。
すべての配列は、連続したメモリ位置で構成されています。 最下位アドレスは最初の要素に対応し、最上位アドレスは最後の要素に対応します。
Numbers(1) | Numbers(2) | Numbers(3) | Numbers(4) | … |
配列は1次元(ベクトルなど)、2次元(行列など)で、Fortranでは最大7次元の配列を作成できます。
配列の宣言
配列は dimension 属性で宣言されます。
たとえば、5つの要素を含む実数のnumberという名前の1次元配列を宣言するには、次のように記述します。
real, dimension(5) :: numbers
配列の個々の要素は、添え字を指定することにより参照されます。 配列の最初の要素の添字は1です。 配列番号には、numbers(1)、numbers(2)、numbers(3)、numbers(4)、numbers(5)の5つの実変数が含まれています。
matrixという名前の整数の5 x 5の2次元配列を作成するには、次のように記述します-
integer, dimension (5,5) :: matrix
また、例えば、いくつかの明示的な下限を持つ配列を宣言することができます-
real, dimension(2:6) :: numbers
integer, dimension (-3:2,0:4) :: matrix
値の割り当て
次のように、個々のメンバーに値を割り当てることができます。
numbers(1) = 2.0
または、ループを使用できます。
do i =1,5
numbers(i) = i * 2.0
end do
1次元配列要素には、配列コンストラクターと呼ばれる短い記号を使用して、値を直接割り当てることができます。
numbers = (/1.5, 3.2,4.5,0.9,7.2/)
- 括弧「(」とバックスラッシュ「/」の間にスペースを入れないでください *
例
次の例は、上記の概念を示しています。
program arrayProg
real :: numbers(5) !one dimensional integer array
integer :: matrix(3,3), i , j !two dimensional real array
!assigning some values to the array numbers
do i=1,5
numbers(i) = i* 2.0
end do
!display the values
do i = 1, 5
Print *, numbers(i)
end do
!assigning some values to the array matrix
do i=1,3
do j = 1, 3
matrix(i, j) = i+j
end do
end do
!display the values
do i=1,3
do j = 1, 3
Print *, matrix(i,j)
end do
end do
!short hand assignment
numbers = (/1.5, 3.2,4.5,0.9,7.2/)
!display the values
do i = 1, 5
Print *, numbers(i)
end do
end program arrayProg
上記のコードをコンパイルして実行すると、次の結果が生成されます-
2.00000000
4.00000000
6.00000000
8.00000000
10.0000000
2
3
4
3
4
5
4
5
6
1.50000000
3.20000005
4.50000000
0.899999976
7.19999981
いくつかのアレイ関連用語
次の表は、いくつかの配列関連の用語を示しています-
Term | Meaning |
---|---|
Rank | It is the number of dimensions an array has. For example, for the array named matrix, rank is 2, and for the array named numbers, rank is 1. |
Extent | It is the number of elements along a dimension. For example, the array numbers has extent 5 and the array named matrix has extent 3 in both dimensions. |
Shape | The shape of an array is a one-dimensional integer array, containing the number of elements (the extent) in each dimension. For example, for the array matrix, shape is (3, 3) and the array numbers it is (5). |
Size | It is the number of elements an array contains. For the array matrix, it is 9, and for the array numbers, it is 5. |
配列をプロシージャに渡す
配列を引数としてプロシージャに渡すことができます。 次の例は、概念を示しています-
program arrayToProcedure
implicit none
integer, dimension (5) :: myArray
integer :: i
call fillArray (myArray)
call printArray(myArray)
end program arrayToProcedure
subroutine fillArray (a)
implicit none
integer, dimension (5), intent (out) :: a
! local variables
integer :: i
do i = 1, 5
a(i) = i
end do
end subroutine fillArray
subroutine printArray(a)
integer, dimension (5) :: a
integer::i
do i = 1, 5
Print *, a(i)
end do
end subroutine printArray
上記のコードをコンパイルして実行すると、次の結果が生成されます-
1
2
3
4
5
上記の例では、サブルーチンfillArrayおよびprintArrayは、次元5の配列でのみ呼び出すことができます。 ただし、任意のサイズの配列に使用できるサブルーチンを作成するには、次の手法を使用して書き換えることができます-
program arrayToProcedure
implicit none
integer, dimension (10) :: myArray
integer :: i
interface
subroutine fillArray (a)
integer, dimension(:), intent (out) :: a
integer :: i
end subroutine fillArray
subroutine printArray (a)
integer, dimension(:) :: a
integer :: i
end subroutine printArray
end interface
call fillArray (myArray)
call printArray(myArray)
end program arrayToProcedure
subroutine fillArray (a)
implicit none
integer,dimension (:), intent (out) :: a
! local variables
integer :: i, arraySize
arraySize = size(a)
do i = 1, arraySize
a(i) = i
end do
end subroutine fillArray
subroutine printArray(a)
implicit none
integer,dimension (:) :: a
integer::i, arraySize
arraySize = size(a)
do i = 1, arraySize
Print *, a(i)
end do
end subroutine printArray
プログラムは size 関数を使用して配列のサイズを取得していることに注意してください。
上記のコードをコンパイルして実行すると、次の結果が生成されます-
1
2
3
4
5
6
7
8
9
10
配列セクション
これまで配列全体を参照してきましたが、Fortranは単一のステートメントを使用して、複数の要素または配列のセクションを参照する簡単な方法を提供します。
配列セクションにアクセスするには、セクションの下限と上限、およびすべての次元のストライド(増分)を指定する必要があります。 この表記法は*添字トリプレット:*と呼ばれます
array ([lower]:[upper][:stride], ...)
下限と上限が指定されていない場合、デフォルトは宣言した範囲になり、ストライド値はデフォルトで1になります。
次の例は、概念を示しています-
program arraySubsection
real, dimension(10) :: a, b
integer:: i, asize, bsize
a(1:7) = 5.0 ! a(1) to a(7) assigned 5.0
a(8:) = 0.0 ! rest are 0.0
b(2:10:2) = 3.9
b(1:9:2) = 2.5
!display
asize = size(a)
bsize = size(b)
do i = 1, asize
Print *, a(i)
end do
do i = 1, bsize
Print *, b(i)
end do
end program arraySubsection
上記のコードをコンパイルして実行すると、次の結果が生成されます-
5.00000000
5.00000000
5.00000000
5.00000000
5.00000000
5.00000000
5.00000000
0.00000000E+00
0.00000000E+00
0.00000000E+00
2.50000000
3.90000010
2.50000000
3.90000010
2.50000000
3.90000010
2.50000000
3.90000010
2.50000000
3.90000010
配列組み込み関数
Fortran 90/95は、いくつかの組み込み手続きを提供します。 これらは7つのカテゴリに分類できます。
- リンク:/fortran/vector_and_matrix_multiplication [ベクトルと行列の乗算]
- リンク:/fortran/reduction [Reduction]
- リンク:/fortran/inquiry [お問い合わせ]
- リンク:/fortran/construction [構築]
- リンク:/fortran/reshape [Reshape]
- リンク:/fortran/manipulation [操作]
- リンク:/fortran/location [場所]