Arrays Fortran中多维数组的线性索引

Arrays Fortran中多维数组的线性索引,arrays,fortran,Arrays,Fortran,设A是维数(m,n,p)的多维数组。Fortran中是否允许线性索引(使用单个索引)?如果是这样,线性索引和多维索引之间的对应关系是什么 换句话说,A(i)是否被允许,A(i)对应于哪个元素(维度的遍历顺序)?解释了数组是以“列主”形式存储的,因此最左边的索引变化最快,其次是从第二个到最左边的,等等(我相信这与C相反)。尝试将多维数组当作一维数组来索引似乎是不明智的,但正如上面链接的页面所解释的,只要您以正确的顺序嵌套循环,编译器将生成这样做的代码(因此非常快)。对于声明的数组维a(m,n,p)

设A是维数(m,n,p)的多维数组。Fortran中是否允许线性索引(使用单个索引)?如果是这样,线性索引和多维索引之间的对应关系是什么


换句话说,A(i)是否被允许,A(i)对应于哪个元素(维度的遍历顺序)?

解释了数组是以“列主”形式存储的,因此最左边的索引变化最快,其次是从第二个到最左边的,等等(我相信这与C相反)。尝试将多维数组当作一维数组来索引似乎是不明智的,但正如上面链接的页面所解释的,只要您以正确的顺序嵌套循环,编译器将生成这样做的代码(因此非常快)。

对于声明的数组
维a(m,n,p)
不允许像
A(i)
那样引用。然而,对于线性索引,所谓的数组元素顺序是一个重要的概念。如左图所示,最左边的指数变化最快
A(1,1,1)
紧跟在
A(2,1,1)
,…,
A(1,2,1)
之前

由于各种关联等原因,数组元素顺序变得很有用。例如,除非有实际需要,否则我不会推荐它们-
等价性和与假定大小数组的参数关联允许大致相同的事情


作为一个更现代的特征,你可以拥有。当然,通过复制,重塑
内部。

您可以将3D数组传递给函数或子例程,就像它是1D数组一样,如下代码所示。我不建议使用此功能,但您将在Fortran 90之前的代码中看到它

program xarray
implicit none
! demonstrate storage association
integer, parameter :: n1 = 2, n2 = 4, n3 = 3
integer :: i1,i2,i3,arr(n1,n2,n3)
forall (i1=1:n1,i2=1:n2,i3=1:n3) arr(i1,i2,i3) = i1 + 10*i2 + 100*i3
print*,"arr =",arr
! output: arr = 111 112 121 122 131 132 141 142 211 212 221 222 231 232 241 242 311 312 321 322 331 332 341 342
call print_array(arr,n1*n2*n3)
end program xarray

subroutine print_array(arr,n)
implicit none
integer, intent(in) :: arr(n)
integer, intent(in) :: n
print*,"arr(1), arr(n) =",arr(1),arr(n)
! output: arr(1), arr(n) = 111 342
end subroutine print_array

我将添加以下可能性,尽管我从未使用过它,因为我发现它令人困惑。有人(见第22页)声称速度更快

哪一个等同于但优于(为什么?)

这相当于但远远优于(为什么?)


非主题问题:子程序print_array(arr,n)是否缺少:integer,intent(in)::n?这实际上与我的另一个问题直接相关-你能看看这个问题吗?我添加了隐式none和声明n,虽然它不是必需的。哦,没错。仅当使用隐式none时才需要它。谢谢福特纳。
do i=1,nx1*ny1*nz1*nelv
    u(i,1,1,1) = vx(i,1,1,1)
enddo
do e=1,nelv
    do k=1,nz1
        do j=1,ny1
            do i=1,nx1
                u(i,j,k,e) = vx(i,j,k,e)
            enddo
        enddo
    enddo
enddo
do i=1,nx1
    do j=1,ny1
        do k=1,nz1
            do e=1,nelv
                u(i,j,k,e) = vx(i,j,k,e)
            enddo
        enddo
    enddo
enddo