2012-03-25 11 views
1

Ich arbeite mit Bildern und Computer-Radon-Transformation für ein Objekt. Die Funktion, die die Transformierte berechnet akzeptiert Vektor als Eingabe:Werte zuweisen zu std :: vector <benutzerdefiniert>

pixel p; 
vector<pixel> segObj //segObj is the object segmneted from the image 

Pixel ist eine benutzerdefinierte struct definiert als:

struct pixel 
{ 
float x, y; //x,y coordinates of the pixel 
}; 

Derzeit I ein Element weise Zuordnung zu dem Vektor tue:

Die for-Schleife verlangsamt den Umgang mit großen Bildern. Gibt es eine Möglichkeit xCoordArray und yCoordArray direkt zuordnen zu vector<pixel>segObj

ich nicht mit der Verwendung von Vektoren expereinced bin so jede mögliche Hilfe würde geschätzt.
Auch Wenn xCoordArray, yCoordArray kann als Vektoren berechnet werden, gibt es eine Möglichkeit, sie zu verbinden, so dass jeder Vektorindex als zwei Werte.

+1

Haben Sie versucht mit 'segObj.reserve (element_count);' vor 'für'loop, so dass' vector' beim Einfügen nicht die Größe ändert und der 'push_back' eine konstante Zeitoperation wird? – Naveen

Antwort

2

Sie können einen Eingabe-Iterator erstellen, der pixel Objekte erzeugt und diese direkt zuweisen.

pixel iterator::operator*() const { 
    pixel rc = { 
     xCoordArray[index], 
     tCoordArray[index] 
    }; 
    return rc; 
} 

Das heißt, ich bezweifle etwas, dass dies tatsächlich der Engpass ist: Sie könnten die Objekte direkt mit etwas entlang der Linien von dieser initialisieren haben Sie Ihren Code Profil oder den Verdacht, dass dies das Problem ist?

3

Ein Grund dafür, dass es langsam ist, ist die Neuzuweisung (und Kopie) durch den Vektor, wie die for-Schleife ausgeführt wird. In Ihrem Fall könnten Sie dies tun:

segObj.reserve(element_count); //DO THIS 

for(int ix=0; ix < element_count; ix++) 
{ 
    f.x = xCoordArray[ix]; 
    f.y = yCoordArray[ix]; 
    segObj.push_back(f); 
} 

Das zumindest wird der Code ein wenig zu verbessern, da es eine Zuordnung vor der Schleife ist, und keine Umverteilung und Kopie gemacht wird, wenn die for Schleife ausführt.

Wenn Ihr Compiler C++ unterstützt 11, dann könnte man dies versuchen:

struct pixel 
{ 
    float x,y; 
    pixel(float x, float y) : x(x), y(y) {} //add this constructor 
}; 

segObj.reserve(element_count); //DO THIS 

for(int ix=0; ix < element_count; ix++) 
{ 
    segObj.emplace_back(xCoordArray[ix], yCoordArray[ix]); 
} 

Beachten Sie, dass es emplace_back nennt, nicht push_back. Diese Elementfunktion ist nur mit C++ 11 verfügbar. Es erstellt die Pixelobjekte an Ort und Stelle. Keine Kopie von Pixelobjekt gemacht wird, wenn auf den Vektor Zugabe:

template< class... Args >
void emplace_back(Args&&... args); (since C++11)

Hängt ein neues Element am Ende des Behälters. Das Element wird an Ort und Stelle konstruiert, d. H. , es werden keine Kopier- oder Verschiebeoperationen ausgeführt. Der Konstruktor des Elements wird mit genau den gleichen Argumenten aufgerufen, die der Funktion übergeben wurden.

+0

Danke für die Antwort. Tatsächlich benutze ich bereits Reserve, aber es gibt wenig Verbesserung, wenn die Anzahl der Pixel> 2000 ist. Ich möchte for Schleife entfernen, aber da jeder Index zwei Werte (x, y) hat, ist es nicht einfach, Funktionen wie zu verwenden.assign() – user1291412

+1

@ user1291412: Selbst wenn Sie 'assign' verwenden können, wäre es immer noch' O (n) 'Operation. Ich bezweifle, dass dies der eigentliche Engpass in Ihrem Programm ist. – Naveen

Verwandte Themen