36

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

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

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

配列は次のいずれかで定義されます

real, dimension(3, 3) :: a

また

real, dimension(:), allocatable :: a
4

3 に答える 3

62

これは、形状変更と形状組み込み関数を使用して行うことができます。何かのようなもの:

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
于 2010-09-14T11:23:57.833 に答える
23

多次元(ランク> 1)配列の場合、Fortranの初期化方法はCソリューションとは異なります。これは、Cでは多次元配列がetcの配列の単なる配列であるためです。

Fortranでは、各ランクは変更されたデータ型の異なる属性に対応します。ただし、ランク1の配列の場合、配列コンストラクターは1つだけです。これらの2つの理由から、配列コンストラクターによる初期化にはRESHAPEintrisic関数が必要です。

すでに回答されていることに加えて、列ではなく行で行列の値を入力するより直接的な方法があります。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)

于 2016-05-01T11:42:20.583 に答える
9

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

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

于 2014-06-23T07:07:49.400 に答える