2016-04-11 20 views
1

Gibt es eine Funktion in Fortran, die ein bestimmtes Element in einem Array löscht, sodass das Array beim Löschen seine Länge um die Anzahl der gelöschten Elemente verringert?Löschen eines bestimmten Elements aus einem Fortran-Array

Hintergrund: Ich arbeite derzeit an einem Projekt, die Sätze von Populationen mit entsprechenden Beschreibungen für die Personen enthalten (d. H. Alter, Todesalter usw.).

Eine Methode, die ich benutze, ist durch das Array zu durchlaufen, zu finden, welche Elemente ich brauche, legen Sie es in ein anderes Array, und die Zuordnung der vorherigen Array und vor dem nächsten Zeitschritt, wird dieses Array zurück in das Array vor durchlaufen die Subroutinen, um noch einmal die nicht benötigten Elemente zu finden.

Antwort

4

Sie können die intrinsische PACK-Funktion und die zugehörige Zuweisung verwenden, um einen Array-Wert zu erstellen, der aus ausgewählten Elementen eines anderen Arrays besteht. Unter der Annahme, array ist zuweisbaren, und die Elemente entfernt werden nominiert werden durch eine logische Maske logical_mask, die die gleiche Größe wie der ursprüngliche Wert von array ist:

array = PACK(array, .NOT. logical_mask) 

Succinct Syntax für ein einzelnes Element durch seinen Index nominiert ist:

Abhängig von Ihrem Fortran-Prozessor können die obigen Anweisungen dazu führen, dass der Compiler Provisorien erstellt, die sich auf die Leistung auswirken können. Wenn dies problematisch ist, müssen Sie den von Ihnen beschriebenen Unterroutinenansatz verwenden.

+1

Es gibt Peinlichkeit in dieser Form, wenn 'Array' nicht von 1 indexiert wird. – francescalus

0

die Diskussion fortzusetzen, die Lösung, die Sie hängt und Zugriff auf die Anzahl der Löschvorgang implementieren möchten könnte Sie tun, wo Sie die Elemente einfügen/löschen (die erste, die letzte, zufällig in der Menge ?), wie greifen Sie auf die Daten zu (von der ersten bis zur letzten, zufällig im Set?), was sind Ihre Effizienzanforderungen in Bezug auf CPU und Speicher? Dann möchten Sie vielleicht für verknüpfte Liste oder für statische oder dynamische Vektoren gehen (andere Arten von Datenstrukturen könnten auch besser Ihren Bedürfnissen entsprechen).

Zum Beispiel:

  1. ein statisches Vektor verwendet werden kann, wenn Sie viele Elemente zufällig zugreifen möchten und wissen, die maximale Anzahl nmax der Elemente im Vektor. Verwenden Sie einfach ein Array von nmax Elementen mit einer zugehörigen Variablen length, die das letzte Element verfolgen wird. Eine Löschung kann einfach und schnell durchgeführt werden, indem das letzte Element mit dem gelöschten ausgetauscht und die Länge reduziert wird.
  2. ein dynamischer Vektor kann implementiert werden, wenn Sie die maximale Anzahl der Elemente nicht kennen. Um systematisches Array Zuordnung + Kopie + Nichtzuordnung bei jedem Löschen/Einfügen zu vermeiden, fixieren Sie die maximale Anzahl der Elemente (wie oben) und vergrößern nur deren Größe (zB nmax wird 10*nmax, dann neu zuweisen und kopieren) beim erreichen das Limit (das umgekehrte System kann auch implementiert werden, um die Anzahl der Elemente zu reduzieren).
Verwandte Themen