在C中,您可以使用卷曲括号语法轻松初始化数组,如果我没记错的话:
int* a = new int[] { 1, 2, 3, 4 };
当您想初始化具有特定的测试值以用于数学目的的矩阵时,如何在fortran中进行二维数组? (不必双重地将每个元素索引在单独的语句上)
数组是由
定义的real, dimension(3, 3) :: a
or
real, dimension(:), allocatable :: a
reshape和形式来做到这一点。类似:
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 in instim:
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)阵列,初始化的福特方式与C解决方案有所不同,因为在C多维阵列中只是等等的数组。
在fortran,每个等级对应于修改后的数据类型的不同属性。但是,对于等级1数组,只有一个数组构造函数。从这两个原因中,通过数组构造函数进行初始化需要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
编译器接受(g95,gfortran)。事实证明
real:: y(3,3) = (/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)
是
shape
,而不是在这里,一个程序初始化了代表本周的二维数组,用于
9
shape和
reshape逻辑上的内容。
3 3
的输出
7 days
表明克里斯特的2 weeks
是PROGRAM INIT2WEEKS
CHARACTER, PARAMETER :: CLIST(7,2) = &
RESHAPE([ ['S','M','T','W','t','F','s'], &
['S','M','T','W','t','F','s'] ], &
SHAPE(CLIST))
INTEGER IDAY,IWEEK
DO IWEEK=1,2
DO IDAY=1,7
WRITE(*,'(A,X,I1,X,A)') 'WEEK',IWEEK,CLIST(IDAY,IWEEK)
ENDDO
ENDDO
WRITE(*,*) 'SHAPE:',SHAPE(CLIST)
STOP
ENDPROGRAM