我想使用隐式do循环在一行上初始化一个数组。但是,我总是得到语法或形状错误。任何人都可以帮我纠正以下构造吗?
integer myarray :: (maxdim, nr)
myarray(1:maxdim,nr) = (/ (/i,i=1,maxdim/),nr /)
答案 0 :(得分:19)
您正在初始化一个包含MAXDIM
行和NR
列的数组,看起来每列包含1到MAXDIM
的整数。
作为第一步,请继续并写出实际的DO
- 循环:
do j=1,NR
do i=1,MAXDIM
myarray(i,j) = i
end do
end do
将内循环折叠为隐式循环结构:
do j = 1,NR
myarray(1:MAXDIM,j) = (/ (i, i=1,MAXDIM) /)
end do
当我们试图折叠外环时,会发生一些奇怪的事情:
myarray = (/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /)
现在,我得到了一个不兼容的排名错误。由于我不太擅长隐式do循环,我查看了数组构造函数的shape
内在结果:
print *, shape(myarray)
print *, shape((/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /))
打印出来
5 10
50
数组构造函数只是展开一维数组,展平任何嵌套数组结构。我们实际上可以删除第二组(/ /)
来简化。由于所有内容都已按正确顺序排列,因此我们可以使用reshape
内在函数来确保正确排名。我的完整测试程序是:
program sotest
implicit none
integer, parameter :: MAXDIM = 5
integer, parameter :: NR = 10
integer :: i
integer :: j
integer :: myarray(MAXDIM, NR)
integer :: myarray_implicit(MAXDIM, NR)
do j = 1,NR
do i = 1,MAXDIM
myarray(i,j) = i
end do
end do
myarray_implicit = reshape((/ ((i,i=1,MAXDIM), j=1,NR) /), (/ MAXDIM, NR /))
print *, all(myarray == myarray_implicit)
end program sotest
答案 1 :(得分:6)
隐式do循环只会创建一个向量,因此您必须重新整形。像这样:
integer, dimension(m,n) :: myarray
integer :: ix, jx
...
myarray = reshape( [ (ix, ix = 1, m*n) ], [ m, n ] )
或者你想要一个更复杂,嵌套,隐含的循环:
myarray = reshape( [ ((ix+jx, ix = 1, m), jx = 1, n) ], [ m, n ] )
请注意,我使用[ ]
的Fortran2003约定来分隔数组结构,而不是(/ /)
。另请注意,您必须声明隐含的do循环索引变量。