Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
45
Добавлен:
14.04.2015
Размер:
543.74 Кб
Скачать

Функции 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

Соседние файлы в папке Фортран_Лекции