初始化二维数组在C语言中,你可以很容易地使用大括号语法初始化数组,如果我没有记错:如何使用Fortran
int* a = new int[] { 1, 2, 3, 4 };
你怎么能对二维做相同的Fortran数组,当你想用数学初始化一个具有特定测试值的矩阵时? (而不必倍加指数在单独的语句的每一个元素)通过
real, dimension(3, 3) :: a
或
real, dimension(:), allocatable :: a
初始化二维数组在C语言中,你可以很容易地使用大括号语法初始化数组,如果我没有记错:如何使用Fortran
int* a = new int[] { 1, 2, 3, 4 };
你怎么能对二维做相同的Fortran数组,当你想用数学初始化一个具有特定测试值的矩阵时? (而不必倍加指数在单独的语句的每一个元素)通过
real, dimension(3, 3) :: a
或
real, dimension(:), allocatable :: a
阵列被定义既可以做,使用reshape和shape内部函数。例如:
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
数组初始化可以在数组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
!
对于多维(秩> 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)
,从而产生所需的效果。
1)大多数编译器现在接受Fortran 2003符号[]来初始化数组,而不是有点尴尬(/ /)。 2)对于简单情况,可以通过提供列主要顺序中的值来省略转置:array = reshape([1,4,7,2,5,8,3,6,9],形状(数组)) – 2010-09-14 13:01:57
我忘了提及我们需要在Fortran 90中工作。 – 2010-09-14 17:36:29