[C++] Matrix / Array2D

alphacast

Ensign
Registriert
Apr. 2004
Beiträge
250
Hi,

also ich habe m. A. ein komisches Problem. Ich möchte gerne ein 2D-Array mit dynamischer, quadratischer Größe haben.

Folgendes funktioniert lokal:
Code:
valarray<double> tmp(size);
valarray< valarray<double> > matrix(tmp, size);
Nun möchte ich die Matrix aber nicht lokal, sondern als Instanzmember haben. Folgendes funktioniert aber nicht:
Code:
valarray<double>* tmp;
valarray< valarray<double> > *matrix;
...
...
tmp = new valarray<double> (size);
matrix = new valarray< valarray<double> > (tmp, size);
Und dies geht scheinbar nur eindimensional:
Code:
valarray<double> tmp;
...
...
tmp.resize(size); // Resize unterstützt kein (tmp, size)
Wie kann ich mir relativ einfach ein performantes 2D-Array erstellen, welches idealerweise noch den Zugriff mit [] erlaubt?

Hab da nochwas gefunden mit Template-Klassen und Operatorüberladung ... dachte aber es geht vielleicht einfacher...

Matrix ist für Operationen auf Bildern gedacht.

Danke! :)
 
Zuletzt bearbeitet von einem Moderator: (Codetags eingeführt...)
Also, das schnellste ist, wenn du dein 2d-Array auf ein 1d-Array abbildest. Du erstellst ein eindimensionales Array mit der Länge des Quadrats der Kantenlänge. Also sowas hier, wenn die Kantenlänge der quadratischen Matrix dim ist:
Code:
double* matrix = new double [dim*dim];
Wahlweise auch mit einem vector o.Ä. :)
Wenn du nun auf die Stelle (x,y) zugreifen willst, errechnest du in einem getrennten Schritt die Position dieses Elements mit:
Code:
index = dim*y +x;
double gesuchterWert = matrix [index];
Eigentlich ganz einfach, oder? Die Index-Berechnung macht dein Programm sowieso, ob du es nun hinschreibst oder nicht. ;)
 
alphacast schrieb:
Code:
valarray<double>* tmp;
valarray< valarray<double> > *matrix;
...
...
tmp = new valarray<double> (size);
matrix = new valarray< valarray<double> > (tmp, size);

Warum das nicht geht ist offensichtlich. Du sagst, dass valarray<T> Elemente vom Typ valarray<double> enthalten soll, versuchst aber, diese Elemente mit valarray<double>* zu initialisieren. Das geht nicht. Es sind zwei verschiedene Typen. (T != T*);

Warum überhaupt Pointer?

Code:
valarray<valarray<double> > x( valarray<double>( 0., sizex), sizey);

Das kannst du so in die Klasse packen und die Initialisierung dann in der Initialisierungsliste durchführen.

Code:
tmp.resize(size); // Resize unterstützt kein (tmp, size)

Hier ist es valarry<T>::resize( size, T); - size kommt zuerst. Das ist auch konform mit dem Rest der STL. Warum das gerade für den valarray-Konstruktor verdreht wurde, weiß ich nicht.

Ich glaube nicht, dass du wirklich die Eigenschaften von valarray brauchst und es ein normaler Vektor nicht auch tut. valarrays sind für numerische Operationen gedacht. Das Rechnen mit Vektoren geht mit den Dingern z.B. prima.

Eine eigene Matrix-Klasse hat sicher auch ihre Vorteile. Operatorüberladung muss dann natürlich sein. Templates nicht zwingend - wenn du nur einen Datentyp brauchst. Ist aber eigentlich auch recht schnell runtergeschrieben.

Für dich kommt wohl eher vector<double>( sizex*sizey, 0.) in Frage. Für den Zugriff musst du dann nur ein wenig rechnen: vector [x,y] -> vector [x + y*sizex]
Diese Umrechnung kann man ja bequem in eine eigene Matrixklasse stecken.
 
Zurück
Oben