web-dev-qa-db-ja.com

Fortranで2次元配列を初期化する方法

Cでは、正しく覚えていれば、中括弧構文を使用して簡単に配列を初期化できます。

int* a = new int[] { 1, 2, 3, 4 };

数学的な目的で特定のテスト値で行列を初期化する場合、Fortranで2次元配列に対して同じことをどのように行うことができますか? (個別のステートメントですべての要素を二重にインデックス付けする必要はありません)

配列は、

real, dimension(3, 3) :: a

または

real, dimension(:), allocatable :: a
28
Fludlu McBorry

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
49
Wildcat

多次元(ランク> 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)、望ましい効果を与えます。

18
GiorgioP

配列の初期化は、以下に示すように、配列宣言ステートメント自体で実行できます。

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/)/)shape9ではなく3 3です!

6