Fortran-arrays

提供:Dev Guides
移動先:案内検索

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 [場所]