Arrays 如何在Fortran中初始化二维数组
在C语言中,如果我没记错的话,可以使用大括号语法轻松初始化数组: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
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中工作。