PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Matrix Klasse mit C++



bucada
28-03-2006, 14:25
Hi !!!

Ich bin leider ein C++ Anfänger (überhaupt ein Programmieranfänger), was insbesondere die Objektorientrierung angeht.
Nun soll ich folgendes Problem in C++ umsetzen und weiss nicht so ganz, wie ich daran gehen soll.

Es soll eine Klasse Matrix geben. Von Ihr abgeleitet zwei Klassen: Explicit und Sparse.
In den Klassen sollen jeweils dieselben Funktionen existieren, z.B. Gauss- Verfahren um Lineare Gleichungssysteme zu lösen.
Die Matrizen, die verwendet werden, sind riesig, so locker 10000x10000 gross.
Die Benutzung soll z.B. so gehen, dass ich irgendwie sagen muss, nehme Matrix, die im Format Explicit dargestellt ist und benutze den Algorithmus Gauss aus der Klasse Explicit.

Das ist das erste grosse Projekt (für mich ist es gross ;) ) und ich habe leider keine Ahnung wie ich da beginnen soll.
Es wäre mir eine grosse Hilfe, wenn jemand mir da einen Tipp geben kann.

Vielen Dank im Voraus.

SeeksTheMoon
29-03-2006, 08:13
eine Matrix ist nichts anderes als ein zweidimensionales Array. Ich weiß nicht welche Datentypen ihr verwendet, aber das spielt eigentlich auch keine Rolle welchen Datentyp die zeilen und Spalten haben.

Beispiel:



class Matrix {
typ* daten[];
Matrix(int zeilen, int spalten) {
// in 2 for-Schleifen daten[zeilen][spalten] mit malloc oder calloc anlegen
}
~Matrix() {
//auf gleiche Weise wieder freigeben
}

//Methoden, z.B. fuer Wertezuweisung usw.
};

class Explicit : public Matrix {
//spezifische Daten, z.B. Methode fuer Gauss
};

class Sparse : public Matrix {
// whatever
};


Dann machst Du irgendwo new Matrix(10000,10000) und kannst dann mit einer Methode Wert für Wert zuweisen, z.B. indem Du den operator= überlädst.

bucada
29-03-2006, 09:35
Vielen Dank.
Ich werde versuchen das umzusetzen.

RHBaum
29-03-2006, 09:40
die verwendet werden, sind riesig, so locker 10000x10000 gross.

das sind schon mal 100 000 000 * Datentyp groesse ^^
wenn die werte "nur" floats sind sind das schon mal grob 400 MB die in deinem Speicher rumoxidieren ^^


// in 2 for-Schleifen daten[zeilen][spalten] mit malloc oder calloc anlegen
100 000 000 mal malloc aufrufen willst du dir nicht wirklich antun oder ? ^^ selbst jeden C Freak wuerden sich da die nackenhaare straeuben .

C-technisch lieber in einem aufruf ala malloc(x*x*sizeof(typ)) ....

C++ technisch ...
Bau dir nen 2 dimensionales Array als klasse in dem nen eindimensionalen vector verwendest, und rechne die x,y, koordinaten in nen eindimensionales z um. rueckwaertig genau so .... das berechnen kostet dich ned so viel zeit.
deine 2 dimensionale Arrayklasse kannst dann verwenden um die matrixfumktionen zu implementieren ....

wenn du mit templates und inline umgehen kannst, solltest das ausgiebig nutzen, dann bleibts auch einigermassen performant.

Ciao ...

SeeksTheMoon
29-03-2006, 10:31
100 000 000 mal malloc aufrufen willst du dir nicht wirklich antun oder ? ^^ selbst jeden C Freak wuerden sich da die nackenhaare straeuben .

C-technisch lieber in einem aufruf ala malloc(x*x*sizeof(typ)) ....

joah, für jedes Element ein malloc aufzurufen ergibt keinen Sinn. Ich war irgendwie geistig dabei alle Elemente durchzulaufen *g*.
Ich meinte eigentlich, erst das Array für die Zeilen mit malloc anlegen und dann die Spalten darin mit malloc anlegen, sind also nur spalten+1 mallocs oder zeilen+1 mallocs.
Ist also nur eine Schleife.
Man spart sich Schleifendurchläufe, wenn die Matrix nicht quadratisch ist und man über den kleineren Wert (zeilen oder spalten) iteriert

RHBaum
29-03-2006, 13:26
Man spart sich Schleifendurchläufe, wenn die Matrix nicht quadratisch ist und man über den kleineren Wert (zeilen oder spalten) iteriert

Nein, einfach alles in nen fetten block, das ist C und C++ technisch das einfachste und performateste ... und wenn deine matrix mal serialisieren musst iss das auch ned mehr das problem dann ...

Du hasst auf die matrix zugrif per index / 2 indizies ... dann brauchst du nich mehr auf der Matrix iterieren .....

nen
for(int i = 0; i < 500; ++i)
{
X = Matrix[10,i]; // was irgendwann mal nach m_vector[10*dimensionX + i] mutiert ...
}

ist nicht wesentlich langsamer als wie wenn du eine dimension aus dem vektor rausloest und ueber diesen vektor wiederrum mit ner schleife iteriest ...

ob du nun pro vorlauf 1 lement ... oder dimenson*x elemente ueberspringst, is performancetechnisch kaum nen unterschied ....

nur bei der verwaltung allokierst dir beispielweise nen wolf, wenn dein array 100*500 elemente gross ist und du 100 mal allok fuer 500 elemente aufrufst ...

speicher allokieren ist teuer, sehr teuer !

Ciao ...

SeeksTheMoon
29-03-2006, 18:00
hm, gutes Argument, aber für einen Anfänger ist es sicher einfacher vom Verständnis wenn er die Matrix auch im Rechner 2-dimensional hat.
Naja, egal: bucada soll entscheiden was er leichter findet :)

RHBaum
31-03-2006, 10:12
Das ist ja das schoene bei C++, das man alles kapseln kann ^^

2 Tage setzt er sich dran, und programmiert was, was sich wie nen 2 dimensionales Array verhaelt und performant wie moeglich ist ...

Ab dann implementiert er nur noch die matrix funktionen und greift auf sein Object zurueck, was halt schon das 2 dimensionale Verhalten hat ....

Das ist doch Objectorientierung wie wir sie moegen ! (und so ziemlich das einzige was man bei c++ richtig ausgiebig lernen muss, STL und new und zeiger sind schon basis, aber auch ziemlich einfach und unkompliziert oder ? )

Ciao ...