2014-12-06 54 views
0

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

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

+3

你[破烂阵列]后(http://stackoverflow.com/q/18316592/3157076)?无论哪种方式,你都可能看到多个声明。 – francescalus 2014-12-06 13:28:09

+0

你应该看看'ALLOCATABLE'关键字。 – 2014-12-06 16:17:41

+0

那么,在这里,衣衫褴褛的数组似乎很有用。 Allocatable当然没有帮助。据我所知,它只适用于常规数组。 – Peaceful 2014-12-06 18:22:12

回答

3

正如你建议,answer另一个问题,看着破烂阵列可能是你想要什么,我会简单地提到了易用性扩展到这个问题的答案(在评论由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