Hey,
ich programmiere grad ne Simulation für das Ising Modell.
Ich habe eine Matrix mit Werten, die nur 2 Zustände annehmen können.
Bisher habe ich dafür aus verschiedenen Gründen ein vector < vector <unsigned char> > verwendet. (unsigned char** ginge genauso)
Das ganze wird dann mit QT visualisiert. Dazu verwende ich ein QImage mit Format Format_Indexed8.
In dem Format gibts ne Farbtabelle und eine Matrix aus chars, in der die Farbindizes gespeichert werden ( 256 mögliche Farben).
So kann ich ganz einfach den Inhalt der Werte-Matrix mit memcpy in die Index-Matrix zeilenweise reinkopieren.
Das sieht dann so aus:
Man kann über scanLine den Pointer des ersten Indexes einer Pixelzeile rausfinden.
Wenn man mit zwei for Schleifen den Pointer des Elements (x,y) dereferenziert und den Wert setzt dauerts 50 mal so lange. Deswegen memcpy.
Speicherplatz war bisher kein Thema, da ich neben der char Matrix auch eine gleichgroße Matrix mit 64bit integers hatte. Deswegen wars egal ob ich für die Werte ein byte (char) oder ein bit (bool) belege.
Jetzt hab ich aber nen Algorithmus gefunden, bei dem ich nur 2 Matrizen mit bool Werten brauche.
Die Frage ist, wie bekomm ich den Inhalt von nem vector<bool> oder von nem bool array effizient in das char array von dem Bild rein?
image->scanLine() liefert immer den Pointer auf das erste Byte. Wählt man statt Format_Indexed8 das Format Format_Mono, so sind in dem byte die ersten 8 Pixel drin und die Farbtabelle hat nur noch 2 Farben.
ich programmiere grad ne Simulation für das Ising Modell.
Ich habe eine Matrix mit Werten, die nur 2 Zustände annehmen können.
Bisher habe ich dafür aus verschiedenen Gründen ein vector < vector <unsigned char> > verwendet. (unsigned char** ginge genauso)
Das ganze wird dann mit QT visualisiert. Dazu verwende ich ein QImage mit Format Format_Indexed8.
In dem Format gibts ne Farbtabelle und eine Matrix aus chars, in der die Farbindizes gespeichert werden ( 256 mögliche Farben).
So kann ich ganz einfach den Inhalt der Werte-Matrix mit memcpy in die Index-Matrix zeilenweise reinkopieren.
Das sieht dann so aus:
Man kann über scanLine den Pointer des ersten Indexes einer Pixelzeile rausfinden.
Wenn man mit zwei for Schleifen den Pointer des Elements (x,y) dereferenziert und den Wert setzt dauerts 50 mal so lange. Deswegen memcpy.
Speicherplatz war bisher kein Thema, da ich neben der char Matrix auch eine gleichgroße Matrix mit 64bit integers hatte. Deswegen wars egal ob ich für die Werte ein byte (char) oder ein bit (bool) belege.
Jetzt hab ich aber nen Algorithmus gefunden, bei dem ich nur 2 Matrizen mit bool Werten brauche.
Die Frage ist, wie bekomm ich den Inhalt von nem vector<bool> oder von nem bool array effizient in das char array von dem Bild rein?
image->scanLine() liefert immer den Pointer auf das erste Byte. Wählt man statt Format_Indexed8 das Format Format_Mono, so sind in dem byte die ersten 8 Pixel drin und die Farbtabelle hat nur noch 2 Farben.