2016-08-22 3 views
2

Ich habe eine Klasse implementiert, die Berechnungen auf Bildern durchführt. Die Verarbeitung wird an einer Teilmenge der gegebenen Bilder (z. B. 100 von 1000) gleichzeitig durchgeführt, und jedes Bild benötigt eine andere Anzahl von Wiederholungen, um es zu beenden. Die Verarbeitung verwendet GPUs und daher ist es nicht möglich, alle Bilder gleichzeitig zu verwenden. Wenn die Verarbeitung eines Bildes beendet ist, wird dieses Bild entfernt und ein weiteres hinzugefügt. Ich bin also mit drei verschiedenen Vektoren image_outcome, image_index, image_operation infromations über die Bilder zu behalten:Welche Datenstruktur wird bevorzugt, anstatt mehrere Vektoren zu manipulieren

  1. Die image_outcome ein std::vector<float> ist und jedes seiner Elemente ist ein Wert, der als Kriterium verwendet wird, um zu entscheiden, wenn das Bild fertig. Die image_index ist eine std::vector<int>, die den Index des Bildes im ursprünglichen Dataset enthält.
  2. Die image_operation ist eine std::vector<MyEnumValue>, die den Vorgang enthält, der zum Aktualisieren der image_outcome verwendet wird. Ist ein enum Typ und sein Wert ist einer von vielen möglichen Operationen.

Es gibt auch zwei Funktionen, eine, um die fertigen Bilder zu entfernen und eine, um so viele Bilder hinzuzufügen wie entfernt (wenn noch genug in der Eingabe vorhanden ist).

  1. remove_images() Die Funktion nimmt alle drei Matrizen und die Bildmatrix und entfernt die Elemente, die die std::vector.erase() verwenden.
  2. Die add_images() nimmt wieder die drei Matrizen und die Bildmatrix fügt den Vektoren neue Bilder und die relevanten Informationen hinzu.

Weil ich eine erase() auf jeden Vektor mit dem gleichen Index verwende (und auch eine ähnliche Art und Weise hinzuzufügen) Ich dachte an:

  1. Verwenden Sie eine privates struct, die drei Vektoren (verschachtelte Struktur hat).
  2. Verwenden Sie eine private class, die mit drei Vektoren (verschachtelte Klasse) implementiert wird.
  3. Verwenden Sie eine andere Datenstruktur als vec.

A Höhe Ebene Beispiel des Codes Fonds unten sein:

class ComputationClass { 
    public: 
    // the constructor initializes the member variables 
    ComputationClass(); 
    void computation_algorithm(std::vector<cv::Mat> images); 

    private: 
    // member variables which define the algorithms parameters 
    // add_images() and remove_images() functions take more than these 
    // arguments, but I only show the relevant here 
    add_images(std::vector<float>&, std::vector<int>&, std::vector<MyEnumValue>&); 
    remove_images(std::vector<float>&, std::vector<int>&, std::vector<MyEnumValue>&); 
}; 

void ComputationClass::computation_algorithm(std::vector<cv::Mat> images) { 
    std::vector<float> image_output; 
    std::vector<int> image_index; 
    std::vector<MyEnumValue> image_operation; 

    add_images(image_output, image_index, image_operation); 

    while (there_are_still_images_to_process) { 
    // make computations by updating the image_output vector 
    // check which images finished computing 
    remove_images(image_output, image_index, image_operation); 
    add_images(image_output, image_index, image_operation); 
    } 
} 
+2

Eine Struktur mit einem 'float', einem' int' und einem 'MyEnumValue', dann ein Vektor dieser Struktur? –

+0

Daten, die miteinander verknüpft sind, sollten zusammen bleiben, oder Sie werden es schwer haben, sie zu verwalten. Es wird auch Cache-Misses reduzieren. – StoryTeller

Antwort

2

denke ich, statt einer Struktur mit drei Vektoren, einem einzelnen Vektor von benutzerdefinierten Objekte besser funktionieren würde.

std::vector<MyImage> images; 

class MyImage { 
    Image OImage; // the actual image 
    float fOutcome; 
    int dIndex; 
    MyEnumValue eOperation; 
    bool getIsDone() { 
     return fOutcome > 0; // random condition 
    } 
} 

können Sie auf Vektor hinzufügen oder aus dem Vektor mit einer Bedingung

if((*it).getIsDone()) { 
    VMyVector.erase(it); 
} 

Meiner Meinung nach ist die Aufrechterhaltung 3 Vektoren löschen, die parallel gehen, ist einfach, Fehler und schwer zu machen zu ändern.

+0

Ich schlage vor, Zeiger zu verwenden, es wird effizienter sein. std :: vektor > bilder; –

+0

3 Vektoren könnten schneller sein. – VladimirS

+0

Sollte ich diese Klasse in der anderen Klasse implementieren, da sie in einem anderen Projekt enthalten sein wird und ich die bestmögliche Kapselung bereitstellen möchte. – Pey

Verwandte Themen