2016-04-11 3 views
1

Есть ли функция в Fortran, которая удаляет определенный элемент в массиве, так что массив при удалении сокращает свою длину на количество удаленных элементов?Удалить определенный элемент из массива Fortran

Справочная информация: В настоящее время я работаю над проектом, который содержит группы населенностей с соответствующими описаниями для индивидуумов (например, возраст, возраст смерти и т. Д.).

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

ответ

4

Вы можете использовать внутреннюю функцию PACK и встроенное назначение для создания значения массива, которое состоит из выбранных элементов из другого массива. Предполагая, что array является размещаемым, а элементы, которые будут удалены назначаются логической маской logical_mask, что имеет тот же размер, как исходное значение array:

array = PACK(array, .NOT. logical_mask) 

сжатого синтаксис для одного элемента, выдвинутого его индексом:

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

+1

В этой форме есть неловкость, если 'array' не индексируется с 1. – francescalus

0

Чтобы продолжить обсуждение, решение, которое вы можете реализовать, зависит от количества операции удаления и доступа вы делаете, где вы вставить/удалить элементы (первый, последний, случайно в наборе ?), как вы получаете доступ к данным (от первого до последнего, случайным образом в наборе?), каковы ваши требования к эффективности с точки зрения процессора и памяти. Тогда вам может понадобиться связанный список или для статических или динамических векторов (другие типы структур данных также могут лучше соответствовать вашим потребностям).

Например:

  1. статический вектор может быть использован, когда вы хотите получить доступ много элементов в случайном порядке и знать максимальное количество nmax элементов в векторе. Просто используйте массив из элементов nmax с связанной переменной length, которая будет отслеживать последний элемент. Удаление можно просто и быстро выполнить мой обмен последним элементом с удаленным и уменьшить длину.
  2. динамический вектор может быть реализован, когда вы не знаете максимальное количество элементов. Чтобы избежать систематического массива alloc + copy + unallocation для каждого удаления/вставки, вы фиксируете максимальное количество элементов (как указано выше) и увеличиваете его размер (например, nmax становится 10*nmax, а затем перераспределять и копировать) при достижении предел (обратная система также может быть реализована для уменьшения количества элементов).
Смежные вопросы