Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

О. В. Бартеньев. Современный ФОРТРАН

lb = lbound(array)

 

 

 

print *, lb

!

2

8

print *, lbound(array, dim = 2)

!

8

 

print *, lbound(array(2:6:2, 10:12))

!

1

1

lb = ubound(array)

 

 

 

print *, lb

!

8

14

print *, ubound(array, dim = 2)

!

14

 

print *, ubound(array(:6:2, 10:12))

!

3

3

end

 

 

 

SHAPE(source) - возвращает одномерный массив стандартного целого типа, содержащий форму массива или скаляра source. Source может иметь любой тип и не может быть перенимающим размер массивом. Размер массива-результата равен рангу source.

Пример:

integer vec(2), array(3:10, -1:3)

 

 

 

vec = shape(array)

 

 

 

write(*, *) vec

!

8

5

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

Пример:

real(8) array (3:10, -1:3)

 

integer i, j

 

i = size(array, dim = 2)

! Возвращает 5

j = size(array)

! Возвращает 40

4.12.4. Функции преобразования массивов

4.12.4.1. Элементная функция MERGE слияния массивов

MERGE(tsource, fsource, mask) - создает согласно заданной маске новый массив из элементов двух массивов.

tsource, fsource - массивы одной формы, одного (любого) типа и параметра типа, из которых берутся элементы в массив-результат.

mask - логический массив той же формы, которую имеют массивы tsource и fsource. Массив mask определяет, из какого массива, tsource или fsource, будет взят в массив-результат очередной элемент.

Функция MERGE возвращает массив той же формы и того же типа, что и массивы tsource и fsource. В массив-результат поступает элемент массива tsource, если соответствующий ему элемент в массиве mask равен

.TRUE., в противном случае в результат поступает элемент из массива fsource.

Пример:

148

4. Массивы

integer tsource(2, 3), fsource(2, 3), ar1 (2, 3) logical mask(2, 3)

tsource = reshape((/1, 4, 2, 5, 3, 6/), (/2, 3/)) fsource = reshape((/7, 0, 8, -1, 9, -2/), (/2, 3/))

mask = reshape((/.true., .false., .false., .true., .true., .false./), (/2,3/))

! tsource:

1

2

3

fsource:

7

8

9

mask:

 

.true.

.false.

.true.

!

4

5

6

 

0

-1

-2

 

 

.false.

.true.

.false.

ar1 = merge(tsource, fsource, mask)

 

! Результат:

1

8

3

end

 

 

 

 

 

!

 

 

0

5

-2

Замечание. Параметр tsource или fsource может быть и скаляром, который по правилам элементности будет расширен в массив надлежащей формы, например:

integer tsource(5) / 1, 2, 3, 4, 5 /, fsource / 7 /

 

 

 

 

 

logical mask(5) / .true., .false., .false., .true., .true. /

 

 

 

 

print *, merge(tsource, fsource, mask)

!

1

7

7

4

5

end

 

 

 

 

 

 

 

 

 

 

 

 

 

4.12.4.2. Упаковка и распаковка массивов

PACK(array, mask [, vector]) - упаковывает массив в одномерный массив (вектор) под управлением массива mask.

array - массив любого типа, который пакуется в вектор. mask - логический массив той же формы, которую имеет и array, или просто логическая величина .TRUE.; mask - задает условия упаковки элементов массива array.

vector - необязательный одномерный массив, имеющий тот же тип и разновидность типа, что и массив array. Число элементов в массиве не должно быть меньше количества элементов со значением .TRUE. в массиве mask.

Функция возвращает одномерный массив того же типа и разновидности типа, что и массив array, и того же размера, что и массив vector, если последний задан. Значение первого элемента в массиве-результате - элемент массива array, который соответствует элементу со значением .TRUE. в mask; второй элемент в массиве-результате - элемент массива array, который соответствует второму элементу со значением .TRUE. в mask, и т. д. Элементы просматриваются в порядке их размещения в памяти ЭВМ (быстрее всего изменяется самый левый индекс). Если vector опущен, то размер результирующего массива равен числу элементов со значением

.TRUE. в mask. Если же параметр mask задан единственным значением

.TRUE., то размер результата равен размеру массива array. Если vector задан и имеет размер, больший числа элементов со значением .TRUE. в mask, то дополнительные элементы массива vector копируются без изменений в результат.

149

О. В. Бартеньев. Современный ФОРТРАН

Пример:

integer array(2, 3), vec1(2), vec2(5)

 

 

 

 

 

 

logical mask (2, 3)

 

 

 

 

 

 

 

 

 

array = reshape((/ 7, 0, 0, -5, 0, 0 /), (/ 2, 3 /))

 

 

 

 

mask = array /= 0

 

 

 

 

 

 

 

 

 

! Массив array:

7

0

0

Массив mask:

 

. true.

. false. . false.

!

0

-5

0

 

 

 

 

.false.

.true. . false.

vec1 = pack(array, mask)

 

 

 

 

 

 

 

 

vec2 = pack(array, mask = array > 0, vector = (/ 1, 2, 3, 4, 5 /))

 

print *, vec1

 

 

!

7

-5

 

 

 

 

print *, vec2

 

 

!

7

2

3

4

5

 

end

 

 

 

 

 

 

 

 

 

UNPACK(vector, mask, field) - возвращает массив того же типа и разновидности типа, как и у одномерного массива vector, и той же формы, что у логического массива mask. Число элементов vector по меньшей мере равно числу истинных элементов массива mask. Параметр field должен быть скаляром либо иметь ту же форму, которую имеет и массив mask, а его тип и параметры типа должны быть такими же, как у vector.

Элемент результата, соответствующий i-му истинному элементу массива mask, считая в порядке следования его элементов, равен i-му элементу vector, а все остальные элементы равны соответствующим элементам field, если это массив, или собственно field, если это скаляр.

Пример:

logical mask (2, 3)

 

 

 

 

 

 

 

integer vector(3) /1, 2, 3/, ar1(2, 3)

 

 

 

 

mask = reshape((/ .true., .false., .false., .true., .true., .false. /), (/ 2, 3 /))

 

! Массив vector:

1

2

3 Массив mask:

. true.

 

. false.

. true.

!

 

 

 

.false.

 

.true.

. false.

ar1 = unpack(vector, mask, 8)

! Результат:

 

 

 

 

print *, ar1(1, :)

 

 

1

8

3

 

print *, ar1(2, :)

 

 

!

8

2

8

 

end

 

 

 

 

 

 

 

4.12.4.3. Переформирование массива

RESHAPE(source, shape [, pad] [, order]) - формирует массив заданной формы shape из элементов массива source. Результирующий массив имеет тот же тип и разновидность типа, что и source.

source - массив любого типа, элементы которого берутся в порядке их следования для формирования нового массива.

shape - одномерный целочисленный массив, задающий форму результата: i-й элемент shape равен размеру i-го измерения формируемого массива. Если pad опущен, общий задаваемый shape размер не должен превышать размера source.

150

4. Массивы

pad - необязательный массив того же типа, что и source. Если в source недостает элементов для формирования результата, элементы pad добавляются в результирующий массив в порядке их следования. При необходимости используются дополнительные копии pad для заполнения результата.

order - необязательный одномерный массив того же размера, что и shape. Переставляет порядок измерений (что изменяет порядок заполнения) массива-результата. Значениями order должна быть одна из перестановок вида (1, 2, ..., n), где n - размер shape; order задает порядок изменения индексов при заполнении результата. Быстрее всего изменяется индекс order(1), медленнее всего - order(n). При этом элементы из source выбираются в нормальном порядке. Далее при нехватке элементов source следуют копии элементов pad. Параметр order позволяет, в частности, переформировывать массивы в принятом в СИ порядке с последующей их передачей в СИ-функцию.

Пример:

integer ar1(2, 5) real f(5,3,8), c(8,3,5)

ar1 = reshape((/ 1, 2, 3, 4, 5, 6 /), (/ 2, 5 /), (/ 0, 0 /), (/ 2, 1 /)) print *, ar1(1, :)

print *, ar1(2, :)

! Результат: 1 2 3 4 5 ! 6 0 1 0 1

! Изменим принятый в Фортране порядок на порядок, принятый в СИ c = reshape(f, (/ 8, 3, 5 /), order = (/ 3, 2, 1 /))

4.12.4.4. Построение массива из копий исходного массива

SPREAD(source, dim, ncopies) - повторяет массив source вдоль заданного измерения в массиве-результате, ранг которого на единицу больше source.

source - массив или скалярная величина любого типа.

dim - целый скаляр, задающий измерение, вдоль которого будет повторен source; 1 dim n+1, где n - число измерений в source.

ncopies - число повторений source; равняется размеру экстента добавляемого измерения.

Функция возвращает массив того же типа и разновидности типа, что и у source. Если source скаляр, то элемент результата равен собственно source. Результат содержит MAX(ncopies, 0) копий source.

Пример:

integer ar1(2, 3), ar2(3, 2)

! Результат:

 

 

 

ar1 = spread((/ 1, 2, 3

/), dim=1, ncopies=2)

1

2

3

 

 

!

1

2

3

ar2 = spread((/ 1, 2, 3

/), 2, 2)

! Результат:

1

1

 

151