隐式do循环数组初始化

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)

  • 注意,写一个`myarray_implicit = reshape((/((i,i = 1,MAXDIM),j = 1,NR)/),shape(myarray_implicit))`也是有效的,以避免明确地输入你的尺寸矩阵了. (8认同)

Hig*_*ark 6

隐式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循环索引变量.