2010-09-14 43 views
22

初始化二维数组在C语言中,你可以很容易地使用大括号语法初始化数组,如果我没有记错:如何使用Fortran

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

你怎么能对二维做相同的Fortran数组,当你想用数学初始化一个具有特定测试值的矩阵时? (而不必倍加指数在单独的语句的每一个元素)通过

real, dimension(3, 3) :: a 

real, dimension(:), allocatable :: a 

回答

42

阵列被定义既可以做,使用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 

还需要transpose禀道:

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 
+12

1)大多数编译器现在接受Fortran 2003符号[]来初始化数组,而不是有点尴尬(/ /)。 2)对于简单情况,可以通过提供列主要顺序中的值来省略转置:array = reshape([1,4,7,2,5,8,3,6,9],形状(数组)) – 2010-09-14 13:01:57

+0

我忘了提及我们需要在Fortran 90中工作。 – 2010-09-14 17:36:29

4

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

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

13

对于多维(秩> 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/)) 

获得所述矩阵阵列正好在由代码行所示的顺序的填充。

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