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

Flu*_*rry 30 arrays fortran array-initialize fortran90

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

int* a = new int[] { 1, 2, 3, 4 };
Run Code Online (Sandbox Code Playgroud)

当您希望初始化具有特定测试值的矩阵用于数学目的时,如何在Fortran中对二维数组执行相同的操作?(无需对单独的语句中的每个元素进行双重索引)

该数组由.定义

real, dimension(3, 3) :: a
Run Code Online (Sandbox Code Playgroud)

要么

real, dimension(:), allocatable :: a
Run Code Online (Sandbox Code Playgroud)

Wil*_*cat 51

你可以使用重塑形状内在函数来做到这一点.就像是:

INTEGER, DIMENSION(3, 3) :: array
array = reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), shape(array))
Run Code Online (Sandbox Code Playgroud)

但请记住列主要订单.阵列将是

1   4   7
2   5   8
3   6   9
Run Code Online (Sandbox Code Playgroud)

重塑后.

所以得到:

1   2   3
4   5   6
7   8   9
Run Code Online (Sandbox Code Playgroud)

你还需要转置内在:

array = transpose(reshape((/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), shape(array)))
Run Code Online (Sandbox Code Playgroud)

对于更一般的示例(具有不同维度的可分配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
Run Code Online (Sandbox Code Playgroud)

  • 1)大多数编译器现在接受Fortran 2003表示法[]来初始化数组,而不是有点尴尬(/ /).2)对于简单的情况,你可以通过提供列主要顺序的值来省略转置:array = reshape([1,4,7,2,5,8,3,6,9],shape(array)) (16认同)

小智 19

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

在Fortran中,每个等级对应于修改数据类型的不同属性.但是对于rank-1数组,只有一个数组构造函数.由于这两个原因,通过数组构造RESHAPE函数初始化需要intrisic函数.

除了已经回答的内容之外,还有一种更直接的方法是按行而不是按列输入矩阵的值:reshape有一个可选参数ORDER,可用于修改填充多维数组元素的顺序与数组构造函数的条目.

例如,在第一个答案中的示例的情况下,可以写:

INTEGER, DIMENSION(3, 3) :: array=reshape( (/ 1, 2, 3, &
                                              4, 5, 6, &
                                              7, 8, 9 /), &
                                           shape(array), order=(/2,1/) )
Run Code Online (Sandbox Code Playgroud)

完全按照代码行所示的顺序获得矩阵阵列的填充.

该数组(/2, 1/)强制列索引(2)优先于行索引(1),从而产生所需的效果.


Sou*_*jee 7

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

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
Run Code Online (Sandbox Code Playgroud)

令我感到惊讶的是

 real:: y(3,3) = (/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)
Run Code Online (Sandbox Code Playgroud)

编译器(试过G95,gfortran)接受.原来,是shape(/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)9,不3 3!