【Fortran学習|豆知識】配列の形状を自在に操る!FortranにおけるSIZEとSHAPE関数の活用術

導入

数値計算において、動的にサイズが変わる配列を扱うことは避けて通れません。もし、あらかじめ配列のサイズを決め打ちしてコーディングしていたら、計算対象のデータが変わるたびにプログラムを修正する必要が出てきます。そこで重要になるのが、配列の情報をプログラム自身に問い合わせるSIZE関数SHAPE関数です。これらを使うことで、どんなサイズの入力データに対しても柔軟に対応できる、堅牢な計算コードを書くことが可能になります。

基礎知識

数値計算でよく使われるFortranなどの言語において、配列はメモリ上の領域を占有します。
SIZE関数は、その配列に含まれる「要素の総数」を返します。例えば3×4の行列であれば、SIZEは12を返します。
一方でSHAPE関数は、配列の各次元がそれぞれいくつのサイズを持っているかを「配列(ベクトル)」として返します。先ほどの3×4の行列であれば、SHAPEは[3, 4]という形状情報を返します。これらを活用することで、ループの上限値を自動的に設定したり、配列のメモリ確保を動的に行ったりすることができます。

実装/解決策

実務では、受け取った配列の形状に合わせて処理を分岐させたり、作業用の領域を確保したりする際にこの関数を使用します。例えば、関数に渡された配列のサイズを取得し、それと同じサイズのワーク配列を確保することで、メモリ効率の良い計算を実現できます。

サンプルプログラム

以下のコードは、入力された2次元配列の情報を取得し、その形状に合わせて計算ループを行う例です。

[code]
program array_info
implicit none
! 動的配列の宣言
integer, allocatable :: matrix(:,:)
integer :: rows, cols
integer :: i, j

! 配列の割り当て(3行4列)
allocate(matrix(3, 4))

! 配列のサイズと形状を取得
! SIZEで全要素数、SHAPEで次元ごとのサイズを取得
rows = size(matrix, 1) ! 1次元目のサイズ(行数)
cols = size(matrix, 2) ! 2次元目のサイズ(列数)

print , “配列の行数: “, rows
print , “配列の列数: “, cols

! 取得したサイズを使ってループ処理を行う
do j = 1, cols
do i = 1, rows
matrix(i, j) = i 10 + j
end do
end do

print , “配列の要素例: “, matrix(1, 1), matrix(3, 4)

! メモリの解放
deallocate(matrix)
end program array_info
[/code]

応用・注意点

現場で注意すべき点は、次元の指定です。SIZE関数は第一引数に配列、第二引数に次元(DIM)を指定できます。`size(matrix, 1)`と指定することで行数、`size(matrix, 2)`で列数を明示的に取得できます。これを省略すると「全要素の積」が返ってくるため、次元ごとのサイズを知りたい場合は必ず次元番号を指定してください。また、未割り当ての動的配列に対してこれらの関数を呼び出すと、実行時エラーになる可能性があるため、割り当て済みかどうかを判定する`allocated()`関数と組み合わせて使用するのが安全なプログラミングの定石です。

コメント

タイトルとURLをコピーしました