【问题标题】:2D array in Fortran 95 array with one dimension variableFortran 95 数组中的二维数组,具有一维变量
【发布时间】:2014-12-06 13:21:10
【问题描述】:

我想在我的代码中将一些东西存储在二维数组中,然后再扫描该数组。数组中有N_{1} 行(第一个索引的数量,比如i)。但是,对于给定的i 值,j 值的数量不是固定的,尽管我知道j 的最大可能值(假设它是N_{2})。

我当然可以创建大小为(N_{1},N_{2}) 的数组来存储我的数据。然而,这似乎浪费了空间,因为我的 N_{2} 值波动很大,而且我的数组中的元素总数也非常大。是否可以根据i 值创建一个具有不同数量j 值的二维数组?或者,即使我可以通过单个 Fortran 命令创建多对多一维数组并正确分配它们,我也可以。

【问题讨论】:

  • 你在ragged arrays之后吗?无论哪种方式,您可能会看到不止一个声明。
  • 您应该查看ALLOCATABLE 关键字。
  • 好吧,参差不齐的数组在这里似乎很有用。可分配的当然没有帮助。据我所知,它仅适用于常规数组。
  • 使用@francescalus 建议的参差不齐的数组类型,编写适当的初始化例程,将其全部放在一个模块中并称之为好。您可以通过调用适当编写的初始化例程来完成对许多数组的一行分配。

标签: fortran


【解决方案1】:

正如您对另一个问题的建议 answer,查看 ragged arrays 可能是您想要的,我将简要提及该答案的可用性扩展(Doug 在评论中暗示利平斯基)。

对于基类型,表示可变长度维度,由高性能标记给出

type :: vector
    integer, dimension(:), allocatable :: elements
end type vector

以及这些数组的类型

type :: ragged_array
    type(vector), dimension(:), allocatable :: vectors
end type ragged_array

有分配步骤

type(ragged_array) :: ragarr

allocate(ragarr%vectors(5))
allocate(ragarr%vectors(1)%elements(3))
! etc.

[或者,人们可能会想只拥有一组type(vector)。]

对于可用性方面,可以创建一个结构构造函数来执行大量分配,甚至依赖于可变长度组件的自动分配。

在后一种情况下,如果在创建时知道值,而不仅仅是范围,这是有意义的。

allocate(ragarr%vectors(5))
ragarr%vectors(1)%elements = [1, 6, 13]
! etc.

对于前一种情况,类似

module ragged

  implicit none

  type :: vector
      integer, dimension(:), allocatable :: elements
  end type vector

  type :: ragged_array
      type(vector), dimension(:), allocatable :: vectors
  end type ragged_array

  interface ragged_array
      module procedure ragged_constructor
  end interface ragged_array

contains

  function ragged_constructor(sizes) result(ra)
      integer, intent(in) :: sizes(:)
      type(ragged_array) ra
      integer i

      allocate(ra%vectors(SIZE(sizes)))
      do i=1,SIZE(sizes)
          allocate(ra%vectors(i)%elements(sizes(i)))
      end do

  end function ragged_constructor

end module ragged

program test

    use ragged
    implicit none

    type(ragged_array) :: ra

    ra = ragged_array([3,4,6,1,12])

end program

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2021-10-23
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多