2016-04-11 67 views
1

Fortran中是否存在刪除數組中特定元素的函數,以便刪除後的數組通過刪除的元素數量縮短其長度?從Fortran數組中刪除特定元素

背景: 我目前正在研究一個項目,其中包含對個人(即年齡,死亡年齡等)進行相應描述的人口集合。

我使用的方法是遍歷數組,找到我需要的元素,將它放在另一個數組中,並釋放前一個數組,然後在下一個時間步之前,將此數組移回數組子程序再次找到不需要的元素。

回答

4

您可以使用PACK內部函數和內在賦值來創建一個數組值,該值由另一個數組中的選定元素組成。假設array是可分配的,並且將被刪除的元素由邏輯掩模logical_mask,其大小爲array原始值相同提名:

array = PACK(array, .NOT. logical_mask) 

由其索引指定單個元素簡潔的語法是:

根據您的Fortran處理器的不同,上述語句可能會導致編譯器創建可能影響性能的臨時對象。如果這有問題,那麼你將需要使用你描述的子程序方法。

+1

如果'array'沒有從1開始索引,那麼在這種形式中會出現尷尬。 – francescalus

0

繼續討論,您可能要實施的解決方案取決於您插入/刪除元素(第一,最後刪除操作訪問你做的數量,隨機的集?),您如何訪問數據(從第一個到最後一個,隨機在集合中?),您在CPU和內存方面的效率要求是什麼? 然後,你可能想要去鏈表或靜態或動態矢量(其他類型的數據結構也可能更適合你的需要)。

例如:

  1. 當你想隨機訪問了很多元素,並知道在向量元素的最大數量nmax一個靜態的載體都可以使用。只需使用一組nmax元素和一個關聯的length變量,該變量將跟蹤最後一個元素。刪除可以簡單而快速地完成,我可以使用刪除的元素交換最後一個元素並減少長度。
  2. 當您不知道元素的最大數量時,可以實現動態矢量。爲了避免系統的陣列分配+拷貝+未分配在每個缺失/插入,則固定元件的最大數目(如上述),並且僅增加其尺寸(例如。nmax變得10*nmax,然後重新分配和複製)在到達時極限(反向系統也可以實現以減少元素的數量)。