2014-12-06 52 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