【问题标题】:Allocate array from array of sizes从大小数组中分配数组
【发布时间】:2013-07-21 11:39:40
【问题描述】:

假设我有一个这样声明的维度数组:

integer, dimension(5) :: dims
dims = (/ 5, 6, 7, 8, 9 /)

我怎样才能最简单地使用这个数组来分配另一个数组,使用dims 的元素来指定各个维度的大小?假设第二个数组是这样声明的:

real, dimension(:,:,:,:,:), allocatable :: dset

为什么我不能执行以下操作?

allocate (dset(dims(:)))

当我尝试编译时得到Error: Rank mismatch in array reference

我意识到我可以做到:

allocate (dset(dims(1), dims(2), dims(3), dims(4), dims(5)))

但我正在寻找更容易扩展的东西。

【问题讨论】:

    标签: multidimensional-array fortran dynamic-memory-allocation allocatable-array


    【解决方案1】:

    由于编译器给出的确切原因,您不能写allocate(dset(dims(:))):它们有不同的等级。如果您要打印shape(dims),您会在屏幕上看到5;如果您要打印shape(dset),您会看到0 0 0 0 05 6 7 8 9(取决于您是否分配了它); dims 是 rank-1 数组,dset 是 rank-5 数组。

    因此,分配可分配对象的唯一方法几乎是通过您认为不可扩展的显式方法。

    【讨论】:

    • 真的没有办法让数组元素变成合适的列表格式吗?我意识到这将是一种“元”,我真的没想到会有这样的捷径,但我希望有一个我不知道的技巧。
    • 替代方案,但它需要两件事:(1) 英特尔 Fortran 编译器和 (2) 已分配的相同维度的数组。如果你已经拥有这两个,你可以使用allocate(dset,mold=already_set_array) 并让你的数组充满零。除此之外,标准方式是only方式。
    • Fortran 语法本质上是不灵活的。我曾经试图强迫语言更优雅,但我已经放弃了,现在更务实了。如果你想要优雅,请使用 Python 或 Mathematica。
    • 优雅在情人眼中。 IMO,Python 相当不优雅,而 Fortran 很漂亮。除此之外,与 Fortran 相比,Python 速度非常慢(真的,任何 解释语言与任何其他编译语言相比都会很慢)
    • 我不认为 Fortran 相对不灵活是个问题。我只是在寻找更好的方法来解决我的问题。现在,我将继续接受您的回答,尽管我仍然希望有更简单的方法而不依赖于英特尔!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多