我想在我的代码中存储二维数组中的内容,然后想要扫描该数组。数组中有N_{1}
行(第一个索引的数量,比如i
)。但是,对于给定的i
值,j
值的数量不固定,但我知道j
的最大可能值(即它是N_{2}
)。
我当然可以创建大小(N_{1},N_{2})
的数组来存储我的数据。然而,这似乎是空间的浪费,因为我的N_{2}
值波动很大,并且我的数组中的元素总数也非常大。是否可以创建一个2D数组,根据j
值可以有不同数量的i
值?或者,即使我可以通过单个Fortran命令创建多个1D阵列并正确分配它们,这对我也没关系。
答案 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