Die perfekte CPP-Matrix
-
Hallo,
ich hab schon die SuFu bemüht und einiges zum Thema gefunden, aber zu DEM Ergebnis bin ich nicht gekommen. Ich wollte anfangen eine kleine lib in C++ zu schreiben, die das Rechnen mit Matritzen umfasst. In C habe ich das schon gemacht (mit 2-dim-Arrays). Die Frage ist, wie man das Konzept der Matrix in C++ am besten umsetzt (mit vector (aber es gibt keine 2-dim-vectors bzw. keine einfache möglichkeit auf die elemente zuzugreifen ([][]))?). Also wie sieht die perfekte Matrix(-klasse) in C++ aus. Soll man dazu überhaupt vector nehmen, und wenn ja, wie sähe die Matrix dann aus (wie erreicht man am besten die 2-Dimensionalität, die man in C so leicht durch die Arrays bekommen hat).
-
THE CHOSEN ONE schrieb:
aber es gibt keine 2-dim-vectors bzw. keine einfache möglichkeit auf die elemente zuzugreifen ([][]))
Du hast dich schon mal mit C++ beschäftigt?
-
Mit Vektoren kannst du das auch zweidimensional machen. Das heisst, du hast einen Vektor, und dessen Elemente sind dann wiederum Vektoren. Das Problem dabei ist aber, dass nicht unbedingt eine schöne Tabellen-Matrix-Form herauskommen muss, da die einzelnen "Zeilen" unterschiedlich lang sein können.
So sähe das etwa aus (mit Integern):
std::vector< std::vector<int> > Vektor; // Füllen des Vektors Vektor[y][x]; // Zugreifen auf die Elemente kannst du so Vektor.at(y).at(x); // Oder so
Allerdings würde ich dir noch raten, das in eine Klasse zu verlegen, vor allem wenn du dann noch mathematische Operationen ausführen willst.
Aber was hindert dich denn daran, wieder 2D-Arrays zu nehmen? Die gibts natürlich nicht nur in C. In C++ kannst du das ganze wieder machen, bei dynamischen wirds vielleicht einfach ein bisschen kompliziert, aber auch das geht (mit
new
unddelete
). Und bei statischen (also wenn du schon zu Compilezeit die Grösse weisst) geht es sowieso ganz einfach.
-
Aber was hindert dich denn daran, wieder 2D-Arrays zu nehmen? Die gibts natürlich nicht nur in C. In C++ kannst du das ganze wieder machen, bei dynamischen wirds vielleicht einfach ein bisschen kompliziert, aber auch das geht (mit new und delete). Und bei statischen (also wenn du schon zu Compilezeit die Grösse weisst) geht es sowieso ganz einfach.
Naja, gerade für mathematische Berechnungen bietet vector einige Vorteile.
-
C++ bietet dir eine Menge Möglichkeiten mit Klassen und Operatorüberladungen!!!
Damit kannst du das ganz leicht realisieren.
-
es gibt sehr viele möglichkeiten. mit google codesearch kann man leicht was finden. zum beispiel die matrix aus der freien (BSD) irrlicht engine.
-
THE CHOSEN ONE schrieb:
Naja, gerade für mathematische Berechnungen bietet vector einige Vorteile.
Welche Vorteile meinst du?
std::vector
bietet gegenüber normalen Arrays nur mehr Funktionen bezüglich Containermanagement und automatischer Speicherverwaltung. Der Vektor beinhaltet keine mathematischen Funktionen.N E O schrieb:
es gibt sehr viele möglichkeiten. mit google codesearch kann man leicht was finden. zum beispiel die matrix aus der freien (BSD) irrlicht engine.
THE CHOSEN ONE schrieb:
Ich wollte anfangen eine kleine lib in C++ zu schreiben, die das Rechnen mit Matritzen umfasst.
Ich denke, er will selber eine schreiben
-
std::vector ist leider nicht sehr performant.
Besser geeignet wäre std::valarray oder halt doch die C Variante mit Arrays.
-
Lütti schrieb:
std::vector ist leider nicht sehr performant.
Schon wieder so eine Behauptung aufgrund von fehlender Information.
-
LordJaxom schrieb:
Lütti schrieb:
std::vector ist leider nicht sehr performant.
Schon wieder so eine Behauptung aufgrund von fehlender Information.
Vielleicht sollten die Worte "Performance" "Geschwindigkeit" etc. auf die Banliste kommen. An der Menge brauchbarer Beiträge ändert das in diesem Forum wahrscheinlich nichts
-
Lütti schrieb:
std::vector ist leider nicht sehr performant.
Besser geeignet wäre std::valarray oder halt doch die C Variante mit Arrays.
1. vector ist ein einfacher array wrapper der nur das feature bietet, diese arrays bei bedarf zu vergrößern. wenn du das nicht brauchst, kannst dem vector auch einfach am anfang einmal sagen, wie groß er werden soll. Dazu kommt noch, dass du direkt ein wundervolles iterator interface für die standard algorithmen hast. (und ansonsten nimm boost::array)
2. std::valarray ist nur auf großrechnern mit einer speziell dafür ausgelegten standard lib wirklich schneller. Der Gedanke des standard kommitees hinter valarray war Parallelisierung. Und die kannste mit einem normalen PC knicken.
-
leider ist ein std::vector<std::vector<double> > nicht unbedingt
eine Matrix, deshalb würde ich schon mit puren c-arrays arbeiten,
da du konstruktion und destruktion ja eh kapselstausserdem ist std::vector für das anwendungsgebiet ein wenig
speicherplatzverschwendung, da eine matrix eben quadratisch ist ...
und jeder vector noch seine size() speichert
-
DieMatrix schrieb:
leider ist ein std::vector<std::vector<double> > nicht unbedingt
eine Matrix, deshalb würde ich schon mit puren c-arrays arbeiten,
da du konstruktion und destruktion ja eh kapselstausserdem ist std::vector für das anwendungsgebiet ein wenig
speicherplatzverschwendung, da eine matrix eben quadratisch ist ...
und jeder vector noch seine size() speichertUm Vektoren aus Vektoren in eine Matrixform zu bringen, kann man das ganze in eine Klasse kapseln, die diese Form erzwingt. Da es ja eh um eine Matrixklasse geht, ist die Kapselung in eine Klasse aber eigentlich auch ein Selbstgänger.