Arrays 如何在Fortran中初始化二维数组

Arrays 如何在Fortran中初始化二维数组,arrays,fortran,fortran90,array-initialize,Arrays,Fortran,Fortran90,Array Initialize,在C语言中,如果我没记错的话,可以使用大括号语法轻松初始化数组: int* a = new int[] { 1, 2, 3, 4 }; 为了数学目的,当您希望使用特定测试值初始化矩阵时,如何在Fortran中对二维数组执行相同的操作?(不必在单独的语句中对每个元素进行双重索引) 该数组由 real, dimension(3, 3) :: a 或 您可以使用和intrinsic来实现这一点。比如: INTEGER, DIMENSION(3, 3) :: array array = reshap

在C语言中,如果我没记错的话,可以使用大括号语法轻松初始化数组:

int* a = new int[] { 1, 2, 3, 4 };
为了数学目的,当您希望使用特定测试值初始化矩阵时,如何在Fortran中对二维数组执行相同的操作?(不必在单独的语句中对每个元素进行双重索引)

该数组由

real, dimension(3, 3) :: a

您可以使用和intrinsic来实现这一点。比如:

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)))
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
对于更一般的示例(具有不同维度的可分配2D数组),需要:

array = transpose(reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), shape(array)))
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

数组初始化可以在数组声明语句本身中完成,如下所示:

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)。结果是
(/(/1,2,3/)、(/4,5,6/)、(/7,8,9/)/)
9而不是
3

对于多维(秩>1)数组,Fortran的初始化方式与C解决方案不同,因为在C中多维数组只是etc数组的数组

在Fortran中,每个列组对应于修改后的数据类型的不同属性。但是对于秩1数组,只有一个数组构造函数。基于这两个原因,通过数组构造函数进行初始化需要
重塑
内部函数

除了已经回答的问题外,还有一种更直接的方法可以按行而不是按列输入矩阵的值:重塑有一个可选参数
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)
,从而产生所需的效果。

1)大多数编译器现在接受Fortran 2003符号[]来初始化数组,而不是有些笨拙的(/)。2) 对于简单的情况,您可以通过提供列中的值来省略转置:数组=重塑([1,4,7,2,5,8,3,6,9],形状(数组)),我忘了提到我们需要在Fortran 90中工作。