在C中,如果我没记错的话,您可以使用花括号语法轻松初始化数组:
int* a = new int[] { 1, 2, 3, 4 };
如果您希望初始化具有特定测试值的矩阵用于数学目的,如何在Fortran中对二维数组执行相同的操作? (无需对单独的语句中的每个元素进行双重索引)
数组由
定义real, dimension(3, 3) :: a
或
real, dimension(:), allocatable :: a
答案 0 :(得分:48)
您可以使用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)))
对于更一般的示例(具有不同维度的可分配2D数组),需要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
答案 1 :(得分:18)
对于多维(rank> 1)数组,Fortran初始化方式与C解决方案不同,因为在C中,多维数组只是数组等数组。
在Fortran中,每个等级对应于修改数据类型的不同属性。但是对于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)
,从而产生预期的效果。
答案 2 :(得分:6)
数组初始化可以在数组声明语句中完成,如下所示:
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
!