Поиск…


замечания

Многие из доступных внутренних процедур имеют общие типы аргументов. Например:

  • логический аргумент MASK который выбирает элементы входных массивов для обработки
  • целочисленный скалярный аргумент KIND который определяет вид результата функции
  • целочисленный аргумент DIM для функции сокращения, который управляет размером, над которым выполняется сокращение

Использование PACK для выбора элементов, удовлетворяющих условию

Внутренняя функция pack объединяет массив в вектор, выбирая элементы на основе заданной маски. Функция имеет две формы

PACK(array, mask)
PACK(array, mask, vector)

(т. е. vector аргумент необязателен).

В обоих случаях array - это массив, а также mask логического типа и соответствующая array (либо скаляр, либо массив той же формы).

В первом случае результатом является массив ранга 1 типов и типов array с числом элементов, являющимся числом истинных элементов в маске.

integer, allocatable :: positive_values(:)
integer :: values(5) = [2, -1, 3, -2, 5]
positive_values = PACK(values, values>0)

приводит к positive_values являющимся массивом [2, 3, 5] .

При наличии аргумента vector rank-1 результат теперь представляет собой размер vector (у которого должно быть как минимум столько элементов, сколько есть истинных значений в mask .

Эффект с vector заключается в том, чтобы вернуть этот массив с исходными элементами этого массива, перезаписанными маскированными элементами array . Например

integer, allocatable :: positive_values(:)
integer :: values(5) = [2, -1, 3, -2, 5]
positive_values = PACK(values, values>0, [10,20,30,40,50])

приводит к positive_values являющимся массивом [2,3,5,40,50] .

Следует отметить, что независимо от формы array аргументов результат всегда является массивом ранга-1.


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

integer, allocatable :: indices(:)
integer i
indices = PACK([(i, i=1,5)], [2, -1, 3, -2, 5]>0)

что приводит к тому, что indices составляют массив [1,3,5] .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow