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

43
在C语言中,你可以使用花括号语法轻松地初始化数组,如果我没记错的话:
int* a = new int[] { 1, 2, 3, 4 };

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

数组可以通过以下方式定义

real, dimension(3, 3) :: a
或者
real, dimension(:), allocatable :: a
3个回答

67

您可以使用reshapeshape内置函数来实现。例如:

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)))

对于更一般的示例(可分配不同维度的二维数组),需要使用size内置函数:

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

22
  1. 现在大多数编译器都接受Fortran 2003标准中用[]来初始化数组的方法,而不是有些笨拙的(/ /)符号。
  2. 对于简单情况,您可以通过按列主序提供值来省略转置:array = reshape ( [1, 4, 7, 2, 5, 8, 3, 6, 9 ], shape (array) )。
- M. S. B.
我忘了提到我们需要使用Fortran 90进行工作。 - Fludlu McBorry

24

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

在 Fortran 中,每个 rank 对应于修改数据类型的不同属性。但是只有一个数组构造器用于 rank-1 数组。出于这两个原因,通过数组构造器进行初始化需要使用 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),从而产生所需的效果。


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)。事实证明,(/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)shape9而不是3 3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接