【Fortran学習|豆知識】数値計算をスマートに!RESHAPE関数で多次元定数行列を一行で定義する方法

導入

数値計算のコードを書いているとき、行列の初期化のために何行もコードを割いていませんか?特に回転行列や重み係数など、小さな定数行列を定義する際、可読性を損なわず簡潔に記述することはバグを減らすために非常に重要です。今回は、Fortran等の科学技術計算で強力な武器となる「RESHAPE関数」を活用し、多次元配列をスマートに定義するテクニックを紹介します。

基礎知識

通常、配列構成子 `[…]` を使うと、データは必ず1次元の並びとして生成されます。しかし、行列計算を行う際には、この1次元データを2次元や3次元の構造に変換する必要があります。ここで登場するのが RESHAPE関数 です。この関数は、1次元の配列を「どのような形状(行数・列数)に並べ替えるか」を指定することで、一気に多次元の定数行列へと変換してくれます。

実装/解決策

RESHAPE関数は、第一引数に「要素のリスト」、第二引数に「形状(shape)」を指定します。
例えば、2×2の行列を作りたい場合、第一引数に4つの数値を並べ、第二引数に `[2, 2]` を渡すだけです。これにより、複雑な行列計算式の中に直接行列を埋め込む「インライン定義」が可能となり、コード全体が数学的な記述に近くなります。

サンプルプログラム

以下のコードは、2次元の回転行列を生成し、ベクトルとの積(MATMUL)を計算する例です。

program reshape_example
implicit none
real :: t = 0.785 ! 45度(ラジアン)
real :: vec(2) = [1.0, 0.0]
real :: rot(2, 2)
real :: result(2)

! RESHAPEを使用して、回転行列を一行で生成
! [cos, -sin, sin, cos] という1次元配列を [2, 2] の行列に変換
rot = reshape([cos(t), -sin(t), sin(t), cos(t)], [2, 2])

! 行列演算(MATMUL)を適用
result = matmul(rot, vec)

! 結果の出力
print , “回転後のベクトル:”, result
end program reshape_example

応用・注意点

この手法を用いる際に最も注意すべき点は、要素の並び順です。多くの科学技術計算言語(Fortranなど)では「列優先(Column-major)」でメモリが確保されます。RESHAPE関数もこの規則に従ってデータを配置するため、行列要素を記述する際は、行方向ではなく「列方向」に並べる必要があることを忘れないでください。

また、要素数が第二引数で指定した形状の総数(行数×列数)と一致しない場合、プログラムは実行時エラーを引き起こします。複雑な行列を扱う場合は、計算ミスを防ぐために、要素数を変数化するか、明示的なコメントを残しておくのが現場での賢い運用術です。ぜひ、コードの簡潔化に役立ててください。

コメント

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