隐式do循环数组初始化

时间:2010-11-01 15:54:00

标签: arrays initialization fortran

我想使用隐式do循环在一行上初始化一个数组。但是,我总是得到语法或形状错误。任何人都可以帮我纠正以下构造吗?

integer myarray :: (maxdim, nr)

myarray(1:maxdim,nr) = (/ (/i,i=1,maxdim/),nr /)

2 个答案:

答案 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循环索引变量。