Fortran中多维数组的线性索引

时间:2014-06-29 00:36:05

标签: arrays fortran

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

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

4 个答案:

答案 0 :(得分:5)

http://www.obliquity.com/computer/fortran/array.html解释说,数组以“column-major”形式存储,因此最左边的索引变化最快,然后是第二个到最左边的等等(这与C,I相反)相信)。尝试索引多维数组似乎是一维的,这似乎是不明智的,但正如上面链接的页面所解释的那样,你的编译器会生成代码,只做那个(因此非常快)你按正确的顺序嵌套你的循环

答案 1 :(得分:4)

您可以将3D数组传递给函数或子例程,就像它是一维数组一样,如下面的代码所示。我不建议使用此功能,但您会在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

答案 2 :(得分:3)

对于声明为dimension A(m,n,p)的数组,不允许引用A(i)。但是,线性索引,即所谓的数组元素顺序是一个重要的概念。如another answer中所述,最左边的索引变化最快。 A(1,1,1)会在A(2,1,1),...,A(1,2,1)等<。p>之前发生

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

作为一种更现代的功能,可以拥有pointer bounds remapping。当然,还有副本reshape内在。

答案 3 :(得分:1)

我会添加以下可能性,即使我从未使用它,因为我发现它令人困惑。有人(Nek5000,见第22页)声称它更快。

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