Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Форма массива. Конформные массивы




Массив в Фортране может иметь до семи измерений. Число измерений называется размерностью или рангом массива; скалярная величина имеет нулевой ранг.

Количество элементов массива в одном измерении называется протяженностью массива в этом измерении.

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

Пример.

real, dimension (2, -10:5, -5:5, 4, -3:2, 5, 2):: S

Здесь массив S имеет ранг 7 и форму (2, 16, 11, 4, 6, 5, 2). Размер массива S равен 84480 элементов. Объем памяти, занимаемый массивом, равен 4 * 84480 = 337920 байт.

Массивы, имеющие одинаковую форму, называются конформными или совместимыми.

Примеры конформных массивов:

1) Конформны следующие одномерные массивы:

integer, dimension (1:11):: A

real, dimension (0:10):: B

double precision (-5:5)::L

Форма этих массивов – одномерный массив из одного элемента, равного 11.

2) Конформны следующие двумерные массивы:

integer, dimension (1:11, -3:0):: A2

real, dimension (0:10, 0:3):: B2

double precision (-5:5, 1:4)::L2

Форма этих массивов – одномерный массив из двух элементов (11, 4).

Функции shape и size

Определить в программе форму или размер массива можно, обратившись к функциям shape или size. Эти функции могут использоваться для массивов в подпрограммах или для динамических массивов.

Функция shape (array) с одним аргументом – именем массива – возвращает форму массива – одномерный целочисленный массив, число элементов которого равно рангу массива-аргумента, а каждый элемент равен протяженности массива-аргумента в данном измерении. Для двумерного массива это количество строк и количество столбцов.

Пример.

integer, dimension (1:11, -3:0):: A2

integer, dimension (1:2):: Sh

...

Sh = shape (A2)! Sh – массив; Sh(1)=11; Sh(2)=4

У функции size (array,[dim]) два аргумента: первый – имя массива – обязательный, второй – номер измерения – необязательный. Если номер измерения указан в числе аргументов, функция возвращает протяженность массива-аргумента по заданному измерению, если нет – функция возвращает полный размер массива-аргумента.

Пример.

integer, dimension (1:11, -3:0):: A2

integer:: Sz, Sz1, Sz2

...

Sz1 = size (A2, 1)! Sz1 = 11

Sz2 = size (A2, 2)! Sz2 = 4

Sz = size (A2)! Sz = 44

Выражения с массивами и присваивание массивов

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

Например, выполнение для массива array оператора присваивания

array = -array

приведет к перемене знака всех элементов массива

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

Пример1. Сложение массивов.

integer, dimension (1:20, 1:20):: A, B, S

S = A + B

Выполнение оператора присваивания равносильно выполнению операторов

do i = 1, 20

do j = 1, 20

S(i, j) = A(i, j) + B(i, j)

Enddo

Enddo

Пример2. Умножить на константу вторую строку матрицы.

integer, dimension (1:20, 1:20):: A

integer, parameter:: C=12

A(2,:) = A(2,:) * C

Результат будет таким же, как и при выполнении операторов

do j = 1, 20

A(2, j) = A(2, j) * C

Enddo

Внимание! Произведением массивов А*В является массив произведений элементов с одинаковыми индексами, а не произведение векторов и матриц в алгебраическом смысле.

Пример3. Сравнение массивов.

integer, dimension (1:40):: A

logical, dimension (1:20):: L

L = A(:20) == A(21:)

Конформны логический массив, первая и вторая половины массива A.

Выполнение оператора присваивания равносильно выполнению операторов

do i = 1, 20

L(i) = A(i) == A(i+20)

Enddo

Оператор и конструкция where

Оператор where можно рассматривать как аналог оператора if для массивов. Если аргументом оператора if является скалярное логическое выражение, то аргументом оператора where является логический массив. Оператор where применяется, когда необходимо выполнить какие-то действия только над элементами массива, удовлетворяющими некоторому условию. Например, оператор

where (A>0) A = sgrt (A)

заменяет положительные элементы массива A значениями квадратных корней из них, остальные элементы не изменяются.

При выполнении оператора создается логический массив-маска (A>0), конформный исходному массиву A и заполненный логическими константами .true. и .false. Следующий этап – вычисление квадратных корней – выполняется только для элементов с маской .truе. без попыток вычислить корни из отрицательных элементов.

Общий вид оператора

where (логическое_выражение_массив) переменная_массив = выражение_массив

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

Внимание! Оператор whereпростой оператор, он пишется в одной строке, если нет символа переноса.

Для выполнения группы присваиваний массивов применяется конструкция
where...endwhere:

where (логическое_выражение_массив)

присваивание массивов

Endwhere

Массив-маска вычисляется один раз и не изменяется во время выполнения присваивания массивов.

Пример1. Используя конструкцию where...endwhere заменить положительные элементы массива A значениями квадратных корней из них.

where (A>0)

A = sqrt (A)

Endwhere

Конструкция where...endwhere позволяет организовать группу альтернативных назначений:

where (логическое_выражение_массив)

присваивание массивов 1

Elsewhere

присваивание массивов 2

Endwhere

Вторая группа присваиваний выполняется в том же порядке и по тем же правилам, но под управлением маски (.not. логическое_выражение_массив), которая также вычисляется один раз в момент выполнения оператора where.

Пример2. Заменить положительные элементы массива A значениями квадратных корней из них, остальные элементы массива обнулить.

where (A>0)

A = sqrt (A)

Elsewhere

A = 0

Endwhere

Динамические массивы

Атрибут dimension описывает массивы. Параметром этого атрибута должен быть список границ индексов по каждому измерению. Количество измерений определяет ранг массива. Массив, границы индексов которого определены как константные выражения, называется статическим. Память для статического массива резервируется на этапе компиляции программы. Размер такого массива не может быть изменен в процессе вычислений.

Размер массива не всегда известен заранее. Например, для его определения нужно ввести некоторые данные или произвести вычисления. В таком случае можно использовать динамические массивы.

Динамический массив – это массив, размер которого определяется при выполнении программы, тогда же происходит и выделение памяти под него. Протяженности динамического массива по измерениям на этапе компиляции неизвестны, и атрибут dimension определяет только ранг «будущего» массива. Список измерений сводится к списку разделенных запятыми двоеточий, число которых равно рангу массива.

Признаком динамического массива является атрибут allocatable в его описании, например:

real, allocatable, dimension (:,:):: X

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

Общий вид оператора allocate:

allocate (список выделяемых массивов)

где каждый элемент списка массивов имеет вид:

имя массива (нижняя граница: верхняя граница)

По умолчанию значение нижняя граница равно 1.

Пример.

real, allocatable, dimension (:,:):: X

integer, allocatable, dimension (:):: Y

...

N = 5

allocate (X(1:N,1:N))! Выделение памяти для X: X(1:5, 1:5)

allocate (Y(1:Size(X)))! Выделение памяти для Y: Y(1:25)

где N – переменная целого типа с определенным положительным значением. Размер одномерного массива Y равен размеру (количеству элементов) двумерного массива X.

Выделенная память автоматически не освобождается, ее необходимо освобождать оператором deallocate, например:

deallocate (X, Y)

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...