tar*_*sch 11 arrays fortran initialization
我想用一个隐式的do循环在一行上初始化一个数组.但是,我总是得到语法或形状错误.任何人都可以帮我纠正以下构造吗?
integer myarray :: (maxdim, nr)
myarray(1:maxdim,nr) = (/ (/i,i=1,maxdim/),nr /)
Run Code Online (Sandbox Code Playgroud)
Tim*_*omb 19
您正在初始化具有MAXDIM行和NR列的数组,并且看起来每列包含整数1到MAXDIM.
作为第一步,继续写出实际的DO循环:
do j=1,NR
do i=1,MAXDIM
myarray(i,j) = i
end do
end do
Run Code Online (Sandbox Code Playgroud)
将内循环折叠为隐式循环结构:
do j = 1,NR
myarray(1:MAXDIM,j) = (/ (i, i=1,MAXDIM) /)
end do
Run Code Online (Sandbox Code Playgroud)
但是,当我们试图折叠外环时,会发生一些奇怪的事情:
myarray = (/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /)
Run Code Online (Sandbox Code Playgroud)
现在,我得到了一个不兼容的排名错误.由于我不太擅长隐式do循环,我查看shape了数组构造函数的内部结果:
print *, shape(myarray)
print *, shape((/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /))
Run Code Online (Sandbox Code Playgroud)
打印出来
5 10
50
Run Code Online (Sandbox Code Playgroud)
数组构造函数只是扩展一维数组,展平任何嵌套数组结构.我们实际上可以放弃第二组(/ /)来简化.由于一切都已按正确的顺序排列,我们可以使用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
Run Code Online (Sandbox Code Playgroud)
隐式do循环只会创建一个向量,因此您必须重新整形.像这样的东西:
integer, dimension(m,n) :: myarray
integer :: ix, jx
...
myarray = reshape( [ (ix, ix = 1, m*n) ], [ m, n ] )
Run Code Online (Sandbox Code Playgroud)
或者你想要一个更复杂,嵌套,隐含的循环:
myarray = reshape( [ ((ix+jx, ix = 1, m), jx = 1, n) ], [ m, n ] )
Run Code Online (Sandbox Code Playgroud)
请注意,我使用Fortran2003约定[ ]来分隔数组结构,而不是(/ /).另请注意,您必须声明隐含的do循环索引变量.