Fortranで2次元配列を初期化する方法
-
02-10-2019 - |
質問
Cでは、Curly Bracesの構文を使用して配列を簡単に初期化できます。
int* a = new int[] { 1, 2, 3, 4 };
数学的な目的で特定のテスト値を持つマトリックスを初期化する場合、2次元配列についてFortranで同じことをするにはどうすればよいですか? (個別のステートメントですべての要素を二重にインデックスする必要はありません)
配列は、によって定義されます
real, dimension(3, 3) :: a
また
real, dimension(:), allocatable :: a
解決
あなたはそれを使ってそれを行うことができます 再構築 と 形 内因性。何かのようなもの:
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
あなたも必要です 転置 本質的:
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では、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/)/)
は いいえ コンパイラに受け入れられました(G95、GFORTRANを試しました)。それは shape
の(/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)
は 9
そしてそうではありません 3 3
!