У меня есть множество массивов разной длины, которые все что-то вроде a1 = [1.0]
, a2 = [1.0,2.0]
и т. Д. Мне нужно прокрутить все массивы в функции и выполнить операции со своими элементами, но ни один из них - функции индекса. Мне было интересно, какой лучший способ сделать это в Fortran 95? Я думаю, вы могли бы сделать массив измерения (max_length, max_length)
и поместить их в это; это позволит вам ссылаться на каждый элемент по индексу, но это будет пустым пространством, и вам придется передавать функцию весь массив каждый раз, когда вы его вызываете, а не только отдельные массивы (я действительно не знаю, дело, но похоже, что это будет.)Цитирование по множеству различных массивов разного размера
ответ
Ответ действительно зависит от конкретного случая, который у вас есть. Если длина различных массивов не одинакова, но, по крайней мере, в том же порядке величины, вы можете быть лучше с одним единственным массивом для всех из них. Однако вам понадобится дополнительный массив, который дает количество элементов для каждого массива. Вы могли бы работать выглядеть примерно так:
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.Однако это часто медленнее, чем прямой подход, поскольку отдельные массивы рассеяны в памяти (проблематично для кеширования).
Спасибо, массивы все довольно малы, я просто собираюсь сделать один большой. Я также не знал, что важно упорядочивать вещи в столбцах против строк. –
Наличие массива (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, который является очень хорошим источником.
Это, к сожалению, не чистый Fortran 2003, на котором настаивает OP. –
- 1. массив массивов разного размера
- 2. Сравнение массивов разного размера
- 3. Как отсортировать список целых массивов разного размера?
- 4. Р: Умножение двух массивов разного размера
- 5. Операции с несколькими типами массивов разного размера
- 6. Передача двумерных массивов разного размера в C++
- 7. эффективно сравнения двух массивов разного размера
- 8. медиана двух отсортированных массивов разного размера
- 9. Цитирование через 2 вектора разного размера в R
- 10. центр два UIViews разного размера по горизонтали
- 11. Цитирование по массиву массивов (создание динамической таблицы)
- 12. Цитирование по списку массивов для подсчета объектов
- 13. jtabbedpane вкладки разного размера
- 14. Входы разного размера bootstrap
- 15. OpenCV Матрица разного размера
- 16. Как нормализовать несколько массивов разного размера в matlab
- 17. Multiply массив разного размера
- 18. Изготовление плитки разного размера
- 19. Заполнение макета разного размера
- 20. Эффективно маркеры разного размера
- 21. Flickr Json разного размера
- 22. Время выполнения для методов сортировки по множеству массивов
- 23. Цитирование по массиву массивов, изменение выхода по данной строке (линиям)
- 24. итераторы массивов различных размеров
- 25. выравнивание изображений разного размера внизу
- 26. CSS, вызывающий страницы разного размера
- 27. Обработка целых чисел разного размера
- 28. Рисунок для разного размера FBO
- 29. Назначение разного размера std :: array
- 30. Круги разного размера с ggplot
Почему вы настаиваете на Fortran 95 при использовании синтаксиса конструктора массива Fortran 2003? В противном случае я бы использовал массив указателей (используя производный тип). –
Почему бы просто не использовать [lbound] (http://gcc.gnu.org/onlinedocs/gfortran/LBOUND.html) и ubound для каждого массива? – max