next up previous contents
След.: Приложение 2: Устаревшие возможности Выше: f08_new_win Пред.: Абстракция   Содержание

Приложение 1: примеры

Приведем несколько примеров из [14] (эта глава -- сокращенный перевод приложения C13 Стандарта).

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

A = B + C * SIN(D) -- поэлементная операция над массивами. Операнды должны быть согласованы, то есть иметь одинаковую конфигурацию. Скаляры согласованы с любым массивом. Все вычисления проводятся до присваивания.

Секции массива:

A (:, 1:N, 2, 3:1:-1) -- секция четырехмерного массива, содержащая все первое измерение, позиции от 1 до N второго, позицию 2 третьего и позиции от $ -1$ до 3 четвертого в обратном порядке.

Присвоение под маской:

WHERE (A > 0) B = LOG (A) -- вычисление логарифма только от положительных элементов массива и присвоение только в соответствующих позициях.

WHERE (A < 0) A = 0 -- обнуление отрицательных элементов массива.

Автоматические массивы:

SUBROUTINE X (N, A, B)

REAL WORK (N, N)

REAL, ALLOCATABLE :: HEAP (:, :)

Здесь в подпрограмме определен автоматический массив WORK, размер которого определяется при ее вызове, и размещаемый массив HEAP, размеры которого также неизвестны заранее и определяются в процедуре явным вызовом ALLOCATE. Второй путь немного сложнее и может уступать в производительности, так как автоматические массивы размещаются в стеке, а для размещаемых может потребоваться обращение к «куче».

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

[1.0, 3.0, 7.2] -- одномерный массив размера 3,

[(1.3,2.7,L = 1,10), 7.1] -- одномерный массив размера 21,

[(I, I = 1, N)] -- натуральные числа от 1 до $ N$ .

Массивы ранга выше первого можно создавать функцией RESHAPE.

Современный Фортран существенно снижает число ситуаций, когда необходим цикл. Это операции над массивами, функции для матричного умножения (P = MATMUL(Q, R)), поиска максимального значения L = MAXVAL(P) и другие. Вот ряд примеров:

F = PRODUCT ([(K, K = 2, N)]) -- факториал.

F = SUM (A * COS(X)) -- сумма Фурье. A и X -- массивы (коэффициентов Фурье и значений аргумента, зависящих от точки, в которой вычисляется ряд).

CF = SUM (A * COS(X), MASK = ABS(A) < 0.01) -- выделение шума, то есть суммируются только слагаемые с достаточно малыми коэффициентами Фурье.

Многие математические формулы переносятся в Фортран (формульный транслятор) почти без изменений, если применять возможности работы с массивами:

Произведение сумм $ \prod\limits_{i=1}^M\sum\limits_{j=1}^Na_{ij}$ :

PRODUCT (SUM (A, DIM=2))

Сумма произведений $ \sum\limits_{j=1}^N\prod\limits_{i=1}^Ma_{ij}$ :

SUM (PRODUCT (A, DIM=1))

Квадратичная невязка -- выражение $ \sum\limits_{i=1}^N(x_i-\bar x)^2$ :

XMEAN = SUM (X) / SIZE (X)

SS = SUM ((X - XMEAN) ** 2)

Нормы векторов; норма $ L^\infty$ вектора X:

MAXVAL (ABS (X));

норма $ L_1$ :

SUM (ABS (X));

норма $ L_1$ :

NORM2(X)

Нормы матриц; строчная норма: MAXVAL(SUM(ABS(A), DIM = 2)) Столбцовая норма: MAXVAL(SUM(ABS(A), DIM = 1)). Евклидова норма: NORM2(A).

Встроенные функции позволяют получать довольно сложную информацию из таблиц данных без использования циклов и условных операторов. Пусть таблица T(M, N) содержит оценки $ M$ студентов в $ N$ тестах; тип -- целый, диапазон значений -- от 0 до $ 100$ .

MAXVAL (T, DIM = 2) -- высший балл каждого студента.

SUM (T) / SIZE (T) -- средний балл.

ABOVE = T > SUM (T) / SIZE(T)

N = COUNT (ABOVE) -- сколько баллов превосходят средний?

MINVAL (T, MASK = ABOVE) -- низший балл из тех, что выше среднего.

ANY(ALL(ABOVE, DIM=2)) -- есть ли студент, все баллы которого выше среднего?

Одновременное вычисление трех кубических многочленов с коэффициентами в матрице $ A$ в точке $ X$ :

RESULT = M (:, 1) + X * (M (:, 2) + X * (M (:, 3) + X * M (:, 4)))


next up previous contents
След.: Приложение 2: Устаревшие возможности Выше: f08_new_win Пред.: Абстракция   Содержание
Ilya A. Chernov 2012-12-19
X