Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PP_KR22.doc
Скачиваний:
5
Добавлен:
10.12.2018
Размер:
377.86 Кб
Скачать
  1. Операции над массивами в языке Фортран 90.

Операции над массивами.

Все операции в языке Фортран 90 выполняются над векторами покомпонентно и фактически являются расширениями соответствующих операций над скалярами.

В языке вводятся понятия:

Ранг массива – размерность от 1 до 7. Ранг скаляра считается равным нулю.

Конфигурация массива – это одномерный массив целого типа, размер которого равен рангу исходного массива, а значения элементов равны размерам по каждому направлению исходного массива.

Массивы одинаковой конфигурации называются согласованными. В согласованных массивах элементы, занимающие одинаковое положение относительно первого элемента, называются соответствующими. Скаляр считается, согласованным с массивом любой размерности.

Все операции над массивами требуют согласованности операндов.

Конструктор массивов дает возможность построить одномерный массив (вектор), имеющий следующий формат: (/С1, С2, … Сn/) ,где Ci – элемент конструктора.

В свою очередь элемент конструктора может иметь один из следующих форматов: 1)скалярное выражение, 2)векторное выражение, 3)неявный цикл.

Пример 1

(/2, 1, 1, 3, 1/)

скалярное выражение

Пример 2

(/A1+A2/)

векторное выражение

Пример 3

(/(2.9, С(N), N=1,3), 8.2/)

что эквивалентно:

(/2.9, С(1), 2.9, С(2), 2.9, С(3), 8.9/)

неявный цикл

Тип конструктора определяется типом входящего в него выражения.

Конструктор можно использовать в качестве: 1)операнда в выражении в качестве; 2)фактического параметра процедуры; 3)элемента списка вывода.

Конструктор не может стоять в левой части оператора присваивания.

В языке имеется возможность преобразовывать массив в массив другой размерности. Например:

INTEGER MAT (3,2)

INTEGER VEC (G)

VEC = (/1,10,100,1000,10000,100000/)

MAT = RESHARE (SHARE=(3,2), SOURCE = VEC)

В этом примере функция RESHARE преобразует исходный вектор VEC в двумерный массив MAT.

Секция массива – часть элементов исходного массива, выбранная из него по определенному правилу. Формат секции массива: b (i1, i2, … , in) , где b – имя исходного массива; ik - индексы секции.

Каждый индекс может быть скалярного типа, векторного типа или индексным триплетом. Скалярный индекс – скалярное выражение целого типа.

Замечание: в секции массива по крайней мере один индекс не должен быть скалярным выражением, в противном случае секция вырождается в элемент.

Формат индексного триплета: [l1] : [l2] : [l3] , где: l1 – нижняя граница; l2 – верхняя граница; l3 – шаг. Пример использования индексного триплета.

DINSION ROW (N), COL (M)

DINSION Z (M, N)

……………

ROW=Z(3,:)

COL=Z(:,J)

CALL SUB1(Z(M:1:-2,1:N:2))

Массиву CALL присваивается J-й столбец массива Z, а массиву ROW – 3-я строка Z.

Пример использования векторного индекса

INTEGER A(10,10), U(3), U(4)

INTEGER MAT (3,4), VNEW(4)

V=(/1,3,2/)

U=(/2,1,1,3/)

VNEW=A(3,U) à A(3,2), A(3,1), A(3,3)

MAT=A(U,V) à

A(1,2), A(1,1), A(1,1), A(1,3)

A(3,2), A(3,1), A(3,1), A(3,3)

A(2,2), A(2,1), A(2,1), A(2,3)

При использовании векторного индекса могут возникать секции с повторами, в которых один и тот же элемент исходного массива используется несколько раз.

Такие секции не могут использоваться в левой части оператора присваивания.

Для ввода/вывода массива можно использовать неявный цикл

DIMENSION A(5), B(3,3)

WRITE (6,1) ((B(I,J), J=1,3), I=1,3)

1FORMAT(1X,3F8.3)

Оператор присваивания в среде операций над массивами.

REAL X(10,10), Y(40), Z(-9:10)

X(10,:) = 2.9 + Y(2:40:2) + SQR(Z)

X(:,3) = 3.5

Здесь оператор присваивания выполняется над секциями массивов в обычном порядке, т.е. каждому элементу секции слева ставится в соответствие элемент секции, получающийся при вычислении выражения справа. Элементы секции перебираются слева направо. Условием является согласованность секций в левой и правой части.

Пример:

REAL X(10)

…………

X(1:10)=X(10:1:-1)

Такой оператор присваивания – встроенный, его особенности: 1)сначала выполняются все операции в правой части над элементами исходных массивов, 2)затем все операции в индексной части слева. После этого → само присваивание. В результате элементы массива X разместятся в обратном порядке.

Присваивание по маске. Рассмотрим следующий пример

WHERE (Y.NE.0)

X(10,:) = 4.1 + Z/Y

ELSE WHERE

X(10,:) = 0.0

END WHERE

В этом примере задается маска в виде лог. выражения над массивом Y. Для тех элементов, где оно истинно, над элементами массивов Z, X, Y выполняется первая часть конструкции, а для остальных – вторая часть конструкции. Конструкция WHERE может не содержать вторую часть ELSE WHERE.

В ФОРТРАН 90 имеются функции, возвращающие в качестве результата массив. Есть возможность использовать традиционные функции в суперскалярном режиме.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]