具有一维变量的Fortran 95阵列中的2D数组

时间:2014-12-06 13:21:11

标签: fortran

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

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

1 个答案:

答案 0 :(得分:3)

正如你建议answer到另一个问题,看看参差不齐的数组可能就是你想要的,我会简要地提一下该答案的可用性扩展(暗示在Doug Lipinski的评论中。

对于基本类型,表示由高性能标记

给出的可变长度维度
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
相关问题