【发布时间】:2011-07-21 07:58:09
【问题描述】:
在 Fortran 90/95 中,基本上有两种方法可以将数组传递给子例程:
PROGRAM ARRAY
INTEGER, ALLOCATABLE :: A(:,:)
INTEGER :: N
ALLOCATE(A(N,N))
CALL ARRAY_EXPLICIT(A,N)
! or
CALL ARRAY_ASSUMED(A)
END PROGRAM ARRAY
SUBROUTINE ARRAY_EXPLICIT(A,N)
INTEGER :: N
INTEGER :: A(N,N)
! bla bla
END SUBROUTINE ARRAY_EXPLICIT
SUBROUTINE ARRAY_ASSUMED(A)
INTEGER, ALLOCATABLE :: A(:,:)
N=SIZE(A,1)
! bla bla
END SUBROUTINE ARRAY_ASSUMED
第二个需要显式接口,通常通过使用模块。
从 FORTRAN77 开始,我习惯了第一种选择,我读到如果你传递整个数组,这也是最有效的。
显式形状的好处是我还可以调用子例程并将数组视为向量而不是矩阵:
SUBROUTINE ARRAY_EXPLICIT(A,N)
INTEGER :: N
INTEGER :: A(N**2)
! bla bla
END SUBROUTINE ARRAY_EXPLICIT
我想知道是否有一种很好的方法可以使用第二个假定形状的界面来完成这种事情,而无需复制它。
【问题讨论】:
-
"不复制它。"不复制什么?
-
我认为@steabert 的意思是原地改变数组的形状,而不是将其复制到一维数组中。
-
谢谢@M。 S. B. 澄清一下,这就是我的意思。所以不是下面提到的
reshape内在解决方案 -
@ M. S. B. 我怀疑。比重塑内在不是解决方案。好吧,我认为事情很大程度上取决于故事的“!bla,bla”部分。 =) 你总是可以使用循环遍历你的二维数组,因为它是一维的。
-
@kemiisto 是的,您始终可以控制索引事物的方式,但我想知道这种“手动”处理是否是唯一的方法。比如说,我有一个接受 NxN 矩阵的子程序,我想传递的矩阵可以通过在 MxMxMxM 形状上使用 4 个索引循环最容易地填充,然后我可以优雅地使用显式形状虚拟对象。
标签: fortran