【问题标题】:Allocating arrays of the same size分配相同大小的数组
【发布时间】:2012-01-27 08:56:37
【问题描述】:

我想分配一个数组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 开始,这不是我想要的。

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

【问题讨论】:

  • 请问您为什么需要这样做。你能不能在分配BA 的同时分配B(或者至少在相同的范围内,当你可以访问用于分配A 的数组边界/形状参数时)。或者,如果您将A 传递到函数或子例程中,您可以不只是有一个假定大小的数组B 位于该例程的本地,它假定A 的形状?
  • 好吧,我想我不需要这个,它真的很不雅。数组A 分配在不同的.f 文件中,边界为A(nlmx-a_offset:nlpx+b_offset, ...),你会注意到这比使用l/ubound 的字符多。
  • 那么我认为 M.S.B. 的回答可能是做你想做的事情的最佳方式。

标签: arrays fortran allocation


【解决方案1】:

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

ALLOCATE(B, MOLD=A)

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

来源:IBM Fortran Ref

【讨论】:

    【解决方案2】:

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

    #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 或更高版本,您可以使用源参数:

    allocate(B, source=A)
    

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

    【讨论】:

      【解决方案3】:

      如果您经常这样做并且认为它太丑陋,您可以编写自己的子例程来处理它,copy_dims (template, new_array),封装您显示的源代码行。您甚至可以设置一个通用接口,以便它可以处理多个等级的数组——有关该概念的示例,请参见 how to write wrapper for 'allocate'

      【讨论】:

      • 是的,如果您会经常使用它并且需要一些灵活性,那么将内容移至专用子例程是非常好的!
      猜你喜欢
      • 1970-01-01
      • 2012-01-19
      • 1970-01-01
      • 2021-01-05
      • 2021-12-17
      • 2013-07-21
      • 2019-07-24
      • 2011-01-03
      • 1970-01-01
      相关资源
      最近更新 更多