Matrice multidimensionale con diverse lunghezze

Sto cercando di creare un array con lunghezze diverse in una seconda dimensione, ad esempio:

A = 1 3 5 6 9 2 3 2 2 5 8 9 

È ansible? Ho passato un bel po ‘di tempo a cercare ma non riesco a trovare nessuno dei due modi.

Sì e no. Prima il no:

Array appropriati in Fortran, come quelli dichiarati in questo modo:

 integer, dimension(3,3,4) :: an_array 

o come questo

 integer, dimension(:,:,:,:), allocatable :: an_array 

sono regolari; per ogni dimensione c’è solo una estensione.

Ma se vuoi definire il tuo tipo per un array irregolare puoi farlo ed è relativamente facile:

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

Con questo tipo di approccio è ansible allocare gli elements di ciascuno dei vectors a una dimensione diversa. Per esempio:

 type(ragged_array) :: ragarr ... allocate(ragarr%vectors(5)) ... allocate(ragarr%vectors(1)%elements(3)) allocate(ragarr%vectors(2)%elements(4)) allocate(ragarr%vectors(3)%elements(6)) 

guardando la prima risposta, sembra che non sia necessario creare il vector tipo derivato, che in realtà è solo un array intero allocabile:

  type ragged_array integer,allocatable::v(:) end type ragged_array type(ragged_array),allocatable::r(:) allocate(r(3)) allocate(r(1)%v(5)) allocate(r(2)%v(10)) allocate(r(3)%v(15)) 

questo rende la notazione un po ‘meno ingombrante ..