Удалить определенный элемент из массива Fortran

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

Предыстория: в настоящее время я работаю над проектом, который содержит наборы населения с соответствующими описаниями для отдельных лиц (например, возраст, возраст смерти и т. д.).

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


person gpppypy    schedule 11.04.2016    source источник


Ответы (3)


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

array = PACK(array, .NOT. logical_mask)

Краткий синтаксис для одного элемента, обозначенного его индексом:

array = [array(:index-1), array(index+1:)]

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

person IanH    schedule 12.04.2016
comment
В этой форме есть неловкость, если array не индексируется с 1. - person francescalus; 12.04.2016

Может быть, вы хотите изучить связанные списки. Вы можете вставлять и удалять элементы, а размер списка автоматически изменяется. Этот ресурс неплохой. http://www.iag.uni-stuttgart.de/IAG/institut/abteilungen/numerik/images/4/4c/Pointer_Introduction.pdf

person Mark S    schedule 11.04.2016

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

Например:

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