Многомерный массив с разной длиной

Я пытаюсь создать массив с разной длиной во втором измерении, например:

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

Возможно ли это? Я потратил много времени на поиск, но не могу понять, в каком направлении.

Ответ 1

Да и нет. Сначала нет:

Соответствующие массивы в Fortran, такие как объявленные следующим образом:

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

или как это

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

являются регулярными; для каждого измерения существует только одна степень.

Но, если вы хотите определить свой собственный тип для оборванного массива, вы можете, и это относительно легко:

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

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

При таком подходе вы можете выделить elements каждого из vectors на другой размер. Например:

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))

Ответ 2

смотрящий на первый ответ, кажется, что нет необходимости создавать производный тип vector, который на самом деле является просто выделяемым целым массивом:

    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))

это делает обозначения немного менее громоздкими.