2013-05-11 4 views
0

У меня есть множество массивов разной длины, которые все что-то вроде a1 = [1.0], a2 = [1.0,2.0] и т. Д. Мне нужно прокрутить все массивы в функции и выполнить операции со своими элементами, но ни один из них - функции индекса. Мне было интересно, какой лучший способ сделать это в Fortran 95? Я думаю, вы могли бы сделать массив измерения (max_length, max_length) и поместить их в это; это позволит вам ссылаться на каждый элемент по индексу, но это будет пустым пространством, и вам придется передавать функцию весь массив каждый раз, когда вы его вызываете, а не только отдельные массивы (я действительно не знаю, дело, но похоже, что это будет.)Цитирование по множеству различных массивов разного размера

+0

Почему вы настаиваете на Fortran 95 при использовании синтаксиса конструктора массива Fortran 2003? В противном случае я бы использовал массив указателей (используя производный тип). –

+0

Почему бы просто не использовать [lbound] (http://gcc.gnu.org/onlinedocs/gfortran/LBOUND.html) и ubound для каждого массива? – max

ответ

0

Ответ действительно зависит от конкретного случая, который у вас есть. Если длина различных массивов не одинакова, но, по крайней мере, в том же порядке величины, вы можете быть лучше с одним единственным массивом для всех из них. Однако вам понадобится дополнительный массив, который дает количество элементов для каждого массива. Вы могли бы работать выглядеть примерно так:

module test 
    implicit none 

    integer, parameter :: dp = kind(1.0d0) 

contains 

    subroutine process(array, nelems) 
    real(dp), intent(in) :: array(:,:) 
    integer, intent(in) :: nelems(:) 

    integer :: ii, jj 

    do ii = 1, size(arrays(dim=2)) 
     do jj = 1, nelems(ii) 
     ! Do something with element jj of array ii. 
     end do 
    end do 

    end subroutine process 

end module test 

где Подмассив array(1:nelems(ii),ii) хранит элементы г-го 1D массив.

следующие моменты может быть интересно отметить:

  • Вы должны организовать свои 1D-подмассива в коллективной колонке 2D-массива мудрой, так что Подмассивы являются Удерживание в памяти.

  • Вы должны передать только две массивы вместо множества массивов в подпрограмму. Это должно дать более четкий код.

  • Конечно, вы теряете память, так как форма коллективного массива должна быть (max_nr_of_elements_in_an_array, number_of_arrays). Если длины массива очень разные, и у вас действительно много массивов, так что потерянная память становится значимой, вы можете подумать о наборе массивов as suggested by Eudoardo.Однако это часто медленнее, чем прямой подход, поскольку отдельные массивы рассеяны в памяти (проблематично для кеширования).

+0

Спасибо, массивы все довольно малы, я просто собираюсь сделать один большой. Я также не знал, что важно упорядочивать вещи в столбцах против строк. –

1

Наличие массива (maxlen, maxlen) вызовет проблемы только в том случае, если вы говорите (тысячи, тысячи), иначе это просто неэффективный подход.

Предположим, что ваши массивы имеют одинаковый тип и одинаковое количество измерений, тогда вы можете создать производный тип, который будет содержать ваши массивы, а затем создать массив типа, который вы только что создали. Поэтому у вас будет массив массива переменной lenth.

type arrays 
    integer(kind=8):: length !optional but very helpfull 
    integer(kind=8), dimension(:), allocatable:: a 
end type arrays 

теперь вы можете объявить массив массивов типа:

type(arrays), dimension(:), allocatable:: arrayList 
type(arrays):: arrayList (1000) !if you know beforehand how many arrays you need 

Есть две вещи, чтобы заметить при таком подходе:

  • в моем опыте, циклически массивы производных типов медленнее, чем с помощью массивов собственных типов.
  • Теперь вы получаете доступ к a1, a2, как arrayList(i) % a(j), который может быть страшно на первый взгляд

Источник: http://courses.physics.illinois.edu/phys466/comp_info/derived.html

Для информации фильме, вы можете посетить Fortran Wiki, который является очень хорошим источником.

+0

Это, к сожалению, не чистый Fortran 2003, на котором настаивает OP. –

Смежные вопросы