dynamische Speicherverwaltung
-
ok. habe mir STL vectors angeschaut. das klingt ja schonmal gut. Aber wie kann ich jetzt damit Matrizen- bzw. vektorrechnungen durchführen? Ich habe bereits eine Klasse, mit der ich Matrizen- und Vektorrechnungen durchführen kann. Wie führe ich jetzt aber die container-klasse vector und meine matrix-klasse zusammen?
-
Du stellst ziemlich allgemeine Fragen bine. Was genau ist dein Problem?
-
ich möchte matrizenrechnung durchführen mit dynamischen Matrizen. d.h. meine Vektoren und Matrizen werden bei jedem schleifendurchlauf um 4 Werte größer. eine klasse matrix.h hab ich bereits mal geschrieben. Aber wie kann ich die Vektoren dynamisch halten? Habe noch nie mit container-klassen gearbeitet.
-
du kannst mit
my_container.push_back (my_vector)Vector-Objekte dem Container hinzufuegen.
Wenn du ueber die im Container vorhandenen Elemete iterieren möchtest funktioniert dies mit Iteratoren:
vector<Vector>::iterator it = container.begin (), itEnd = container.end (); for (;it != itEnd; it++) { // Aktueller Eintrag im Container Vector & my_vector = *it; }
-
ich versuchs nochmal:
ich habe eine klasse TMatrix mit der ich wie gewünscht mit matrizen rechnen kann.
BeispielTMatrix A(3,3),B(3,3),C(3,3); int i,j; int r,c; A(1,1)=2; A(1,2)=0; A(1,3)=0; A(2,1)=0; A(2,2)=2; A(2,3)=0; A(3,1)=0; A(3,2)=0; A(3,3)=2; C=inv(A); // Inverse von A B=C*A;ich möchte jetzt aber die Größe nicht bereits am Anfang festlegen, da die matrizen größer werden. ich verstehe nicht wie ich meine Klasse TMatrix mit der Container-klasse vector, mit welcher dynamische Vektoren ermöglicht werden, verbinden kann?!?
ich werd noch ein wenig weiter nach literatur recherchieren. vielleicht versteh ich das ganze noch zu wenig. trotzdem vielen Dank für deine hilfe!
-
Achso...
Da deine Matrix ansich wachsen soll musst du sowas wie vector<vector<double>> für die Matrix verwenden (Dadurch hast du die von dir benötigte 2 dimensionale Variable, allerdings dürft die Initialisierung ein bißchen aufwendiger sein).
Es bleibt dir hierbei überlassen ob der äußere Vector die Zeilen oder die Spalten Anzahl definiert. Die eigentlichen Werte befinden sich im inneren Vector.
-
Danke. Klingt schon mal ganz gut. und wie kann ich damit dann matrizenrechnung mit meiner Klasse durchführen? Ich versteh noch nicht, wie ich meine Klasse und die Vektorklasse miteinander verbinde.
-
Anstatt in deiner Klasse auf [][]-Arrays aufzubauen, musst du deinen Klasse umschreiben und auf vector< vector<double> > aufbauen.
-
Hallo Bine,
ich hab vor einiger Zeit genau das gleiche mal gemacht und hab das wie folgt gelöst:class Matrix(){ pulic: Matrix(void); Matrix(int r, int c); // ... float &operator () (int r, int c); // ... // überladene Operatoren und andere Funktionen private: float **m; int row, col; void MatrixCreate(int r, int c); void MatrixResize(int r, int c); };Die Funktion mit den Klammern sieht dann bei mir so aus (und hier ist noch ein Bug, den ich aber nicht verstehe *gleichFrageandieCracksstell*)
float &Matrix::operator () (int r, int c){ if (r>=0 && r<row && c>= 0 c<col) return m[r][c]; else if (r>=0 && c>=0){ MatrixResize(r+1,c+1); return m[r][c]; } }Die Funktion MatrixResize sorgt dafür, dass ich mir keine Gedanken über die Dimension machen muss:
void Matrix::MatrixResize(int r, int c){ float **m_copy = this->MatrixReturn(); //liefert mir das Array zurück int r_copy = row; int c_copy = col; row = (r>=row)?r:row; col = (c>=col)?c:col; MatrixCrate(row,col); for (int i=0;i<r_copy;i++) for (int j=0;j<c_copy;j++) m[i][j] = m_copy[i][j]; delete [] m_copy; }Die Funktion MatrixCreate erzeugt mir dann die Matrix mit new - und hier liegt bei mir der Hase im Pfeffer...
void Matrix::MatrixCreate(int r, int c){ m = new float*[r]; for (int i=0;i<c;i++){ m[i] = new float[c]; for (int j=0;j<c;j++) m[i][j] = 0.0f; } }Mit diesen Funktionen komme ich zwar ganz gut zurecht, ich habe aber Speicherprobleme wenn ich meine Funktionen verschachtele. Eine Funktionsdefinition des Kreuzproduktes ist zum Beispiel die folgende:
Matrix &cross (Matrix mat1, Matrix mat2){ static Matrix result(3); // bla bla return result; }Funktioniert auch noch im einfachen Fall. Nun möchte ich aber im Code meine Funktionen verschachteln. Z.B. cross(eye(3,1),inv(rand(3,3))*ones(3,1)); und hier steigt dann die Programmierung aus. Das Ergebnis des oberen Beispiels ist eine Matrix mit Nullen unabhängig davon ob tatsächlich ein Null Vektor herauskommen würde. Ich denke, dass Problem liegt im & im Funktionsaufruf und dem static in der Funktion. Weiss hier jemand Rat?
So long
TAlexp.s. sorry Bine, dass ich deinen Thread für mein Problem missbrauche.
-
Hallo,
Bezüglich der static Variable die du als Referenz zurückgeben willst gibt es auch eine schöne Erklärung in
Scott Meyers, Effektiv C++ programmieren, Kapitel 23, "Versuchen sie nicht eine Referenz zurückzugeben, wenn sie ein Objekt zurückgeben müssen".
Ciao