分配相同大小的数组

时间:2012-01-27 08:56:38

标签: arrays fortran allocation

我想将数组B分配为相同的形状与另一个数组A具有相同的下限和上限。例如,我可以使用

allocate(B(lbound(A,1):ubound(A,1), lbound(A,2):ubound(A,2), lbound(A,3):ubound(A,3)))

但这不仅不够优雅,而且对于(甚至)更高维度的阵列也会非常烦人。

我希望有更像

的东西
allocate(B(shape(A)))

哪个不起作用,即使这确实有效,每个维度也会从1开始,这不是我想要的。

有谁知道如何轻松地为任意数组维度轻松分配数组以使其具有与另一个数组相同的大小和边界?

3 个答案:

答案 0 :(得分:12)

从Fortran 2008开始,现在有MOLD可选参数:

ALLOCATE(B, MOLD=A)

  

MOLD =说明符的工作方式几乎与SOURCE =相同。如果指定MOLD =且source_expr是变量,则无需定义其值。另外,MOLD =不会将source_expr的值复制到要分配的变量。

来源:IBM Fortran Ref

答案 1 :(得分:8)

您可以在预处理程序指令中定义它,但它将具有固定的维度:

#define DIMS3D(my_array) lbound(my_array,1):ubound(my_array,1),lbound(my_array,2):ubound(my_array,2),lbound(my_array,3):ubound(my_array,3)

allocate(B(DIMS3D(A)))

不要忘记编译,例如-cpp选项(gfortran)

如果使用Fortran 2003或更高版本,则可以使用source参数:

allocate(B, source=A)

但这也会将A的元素复制到B。

答案 2 :(得分:5)

如果你这么做并认为它太丑了,你可以编写自己的子程序来处理它,copy_dims (template, new_array),封装你显示的源代码行。您甚至可以设置一个通用接口,以便它可以处理多个排名的数组 - 有关该概念的示例,请参阅how to write wrapper for 'allocate'