Cでは、正しく覚えていれば、中括弧構文を使用して簡単に配列を初期化できます。
int* a = new int[] { 1, 2, 3, 4 };
数学的な目的で特定のテスト値で行列を初期化する場合、Fortranで2次元配列に対して同じことをどのように行うことができますか? (個別のステートメントですべての要素を二重にインデックス付けする必要はありません)
配列は、
real, dimension(3, 3) :: a
または
real, dimension(:), allocatable :: a
reshape および shape 組み込み関数を使用してそれを行うことができます。何かのようなもの:
INTEGER, DIMENSION(3, 3) :: array
array = reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), shape(array))
ただし、列優先の順序を覚えておいてください。配列は
1 4 7
2 5 8
3 6 9
再形成後。
取得するには:
1 2 3
4 5 6
7 8 9
transpose 組み込み関数も必要です:
array = transpose(reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), shape(array)))
より一般的な例(異なる次元の割り当て可能な2D配列)の場合、 サイズ 組み込み関数が必要です。
PROGRAM main
IMPLICIT NONE
INTEGER, DIMENSION(:, :), ALLOCATABLE :: array
ALLOCATE (array(2, 3))
array = transpose(reshape((/ 1, 2, 3, 4, 5, 6 /), &
(/ size(array, 2), size(array, 1) /)))
DEALLOCATE (array)
END PROGRAM main
多次元(ランク> 1)配列の場合、Cの多次元配列はetcの配列の配列にすぎないため、Fortranの初期化方法はCソリューションとは異なります。
Fortranでは、各ランクは変更されたデータ型の異なる属性に対応しています。ただし、ランク1配列の場合、配列コンストラクターは1つだけです。これら2つの理由から、配列コンストラクターによる初期化にはRESHAPE
組み込み関数が必要です。
既に回答されていることに加えて、列の代わりに行ごとに行列の値を入力するより直接的な方法があります:reshapeにはオプションの引数ORDER
があります。配列コンストラクターのエントリを持つ多次元配列の要素。
たとえば、最初の回答の例の場合、次のように書くことができます。
INTEGER, DIMENSION(3, 3) :: array=reshape( (/ 1, 2, 3, &
4, 5, 6, &
7, 8, 9 /), &
shape(array), order=(/2,1/) )
コードの行で示されている順序で正確に行列配列を埋めます。
配列(/2, 1/)
は、列インデックスを強制します(2)
行インデックスを優先する(1)
、望ましい効果を与えます。
配列の初期化は、以下に示すように、配列宣言ステートメント自体で実行できます。
program test
real:: x(3) = (/1,2,3/)
real:: y(3,3) = reshape((/1,2,3,4,5,6,7,8,9/), (/3,3/))
integer:: i(3,2,2) = reshape((/1,2,3,4,5,6,7,8,9,10,11,12/), (/3,2,2/))
end program test
驚いた
real:: y(3,3) = (/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)
notはコンパイラーに受け入れられます(g95、gfortranを試しました)。 (/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)
のshape
は9
ではなく3 3
です!