Поиск местоположения массива FORTRAN, 4-мерный массив - PullRequest
0 голосов
/ 27 апреля 2011

Эй, ребята, у меня есть вопрос. Если задан четырехмерный массив в FORTRAN и указано найти местоположение определенной его части (с начальным местоположением 200 и 4 байта на целое число). Существует ли формула для поиска местоположения, если она хранится в основном порядке строк и основных столбцов.

В основном дан массив A (x: X, y: Y, z: Z, q: q) и сказано, чтобы найти местоположение в A (a, b, c, d), какова формула для определения местоположения

Ответы [ 3 ]

2 голосов
/ 28 апреля 2011

Это происходит постоянно при использовании библиотек C с Fortran - например, при вызове подпрограмм MPI, пытающихся отправить определенные подмножества массивов Fortran.

Fortran - Major-row или полезнее, первый индекс движется быстрее всего.То есть элемент после A (1,2,3,4) в линейном порядке в памяти равен A (2,2,3,4).Итак, в приведенном выше примере увеличение на единицу - это скачок на 1 индекс в массиве;скачок b на единицу соответствует скачку (X-x + 1);скачок в c на единицу соответствует скачку (X-x + 1) x (Y-y + 1), а скачок d на единицу - скачок (X-x + 1) x (Y-y)+ 1) х (Z-Z + 1).В языках на основе C это было бы как раз наоборот;скачок 1 в индексе d переместит вас на 1 индекс в памяти;скачок c будет скачком (Q-q + 1) и т. д.

Если у вас есть m признаков, а n i - это индекс (основанный на нуле)i th индекс слева, и этот индекс имеет диапазон N i , тогда индекс (начиная с нуля) из начальной позиции выглядит примерно так:

enter image description here

где произведение равно 1, если верхний индекс меньше нижнего индекса.Чтобы найти число байтов от начала массива, вы должны умножить его на размер объекта, например, 4 байта для 32-разрядных целых чисел.

1 голос
/ 28 апреля 2011

Прошло более 25 лет с тех пор, как я сделал ФОРТРАН.

Я считаю, что ФОРТРАН, в отличие от многих других языков, выкладывает массивы в основной столбец заказа. Это означает, что самый левый индекс тот, который изменяется наиболее часто при обработке мульти размерный массив в линейном порядке. однажды максимальный размер самого левого индекса достигнут, установите его обратно в 1, предполагая, что 1 основано индексирование, увеличение индекса следующего уровня на 1 и запуск процесса заново.

Для расчета конфигурации индекса для любого заданного смещения адреса вам нужно знать значение каждого из 4 измерений массива. Без этого ты не можешь сделать это.

Пример:

Предположим, ваш массив имеет размеры 2 на 3 на 4 на 5. Это подразумевает всего 2 * 3 * 4 * 5 = 120 ячеек в матрице. Вы хотите индекс, соответствующий до 200 байта. Это будет (200/4) - 1 = 49-я ячейка (это предполагает 4 байта на ячейку и смещение нуля первая ячейка).

Сначала понаблюдайте, как конкретные индексы переводятся в смещения ...

В каком номере ячейки находится элемент X (1,1,1,1)? Простой ответ: 1 На каком номере ячейки находится элемент X (1, ​​2, 1, 1)? Так как мы проехали крайнее левое измерение это должно быть это измерение плюс 1. Другими словами, 2 + 1 = 3. Как насчет X (1, ​​1, 2, 1)? Мы ездили на велосипеде через первые два измерения что составляет 2 * 3 = 6 плюс 1, чтобы дать нам 7. Наконец, X (1, ​​1, 1, 2) должно быть: 2 * 3 * 4 = 24 плюс 1 дает 25-ю ячейку.

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

Максимальный правый индекс увеличивает каждые (2 * 3 * 4 = 24) ячейки. 24 входит в 49 (номер ячейки мы хотим найти индексацию для) дважды оставив 1 осталось. Добавьте 1 (для 1 на основе индексации), который дает нам самый правый значение индекса 2 + 1 = 3. Следующий индекс (двигаясь влево) меняет каждую (2 * 3 = 12) ячейку. Один идет в 12 ноль раз, это дает нам индекс 0 + 1 = 1. Следующий индекс меняется каждые 2 ячейки. Один идет в 2 ноль раз, давая значение incex 1. Для последнего (крайний левый индекс) просто добавьте 1 к любому осталось 1 + 1 = 2. Это дает нам следующую ссылку X (2, 1, 1, 2).

Дважды проверьте, вернув его к смещению:

((2 - 1) + ((1 - 1) * 2) + ((1 - 1) * 2 * 3) + ((3 - 1) * 2 * 3 * 4) = 49.

Просто измените числа и используйте один и тот же процесс для любого количества измерений и / или смещения.

1 голос
/ 28 апреля 2011

У Фортрана есть порядок столбцов для массивов.Это описано в http://en.wikipedia.org/wiki/Row-major_order#Column-major_order. Далее в этой статье приведено уравнение для смещения памяти массива более высокой размерности.

...