如何在Fortran中初始化二维阵列
-
02-10-2019 - |
题
在C中,如果我没记错的话,您可以使用Curly Bracs语法轻松初始化数组:
int* a = new int[] { 1, 2, 3, 4 };
当您想初始化具有特定测试值以用于数学目的的矩阵时,如何在fortran中进行相同的操作? (无需双向索引单独的语句上的每个元素)
阵列要么定义
real, dimension(3, 3) :: a
或者
real, dimension(:), allocatable :: a
解决方案
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)))
有关更一般的示例(可分配的2D数组具有不同的维度),一个需要 尺寸 固有的:
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)阵列,初始化的Fortran方式与C解决方案有所不同,因为在C多维数组中只是等等的数组。
在Fortran中,每个等级对应于修改后的数据类型的不同属性。但是,对于等级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)
, ,给出所需的效果。
数组初始化可以在数组声明语句本身中完成,如下所示:
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
!
不隶属于 StackOverflow