PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fragen zu einer Klasse für Matrizenrechnung in C#


aths
2005-10-28, 03:07:01
Habe vorhin C# 2005 Beta installiert, und überlege, als Fingerübung eine kleine Klassen für einfache Matrizenrechnung zu schreiben. Dazu folgende Fragen:

- Sollten die einzelnen Komponenten komplexe Zahlen sein oder reichen normale Zahlen aus? Also erlaubt die Nutzung komplexer Zahlen das Ausführen von Matrizenoperationen (Inverse bilden) auch dann, wenn es mit reelen Zahlen nicht mehr geht?

- Zum Lösen eines Gleichungssystem hat man den "Vektor der rechten Seite". Ist es vom Klassendesign her günstiger, dafür eine Vektorklasse zu schreiben, ggf. die Matrix-Klasse davon ableiten oder als 1D-Array von Spaltenvektoren sehen, oder nur eine Matrix-Klasse schreiben und wenn man einen Vektor braucht eben eine entsprechend dimensionierte Matrix (eben nur eine Spalte) dafür verwenden?

- Zum Bilden der Inverse einer Matrix: Gibt es Verfahren, die nummerisch möglischst stabil sind?

Coda
2005-10-28, 03:37:22
Zur ersten Frage kann ich dir nichts sagen, ich weiß nur, dass ich nie eine Matrix-Klasse mit komplexen Zahlen gesehen habe (na gut, ich könnte ohne Probleme std::complex als template-parameter übergeben und hätte sie, aber wozu?)

Ich würde eine Vektorklasse dafür schreiben.

Ansonsten: http://skal.planet-d.net/demo/matrixfaq.htm

aths
2005-10-29, 12:09:56
Weitere Vorschläge?

Pinoccio
2005-11-08, 16:14:25
- Sollten die einzelnen Komponenten komplexe Zahlen sein oder reichen normale Zahlen aus? Also erlaubt die Nutzung komplexer Zahlen das Ausführen von Matrizenoperationen (Inverse bilden) auch dann, wenn es mit reelen Zahlen nicht mehr geht?

- Zum Lösen eines Gleichungssystem hat man den "Vektor der rechten Seite". Ist es vom Klassendesign her günstiger, dafür eine Vektorklasse zu schreiben, ggf. die Matrix-Klasse davon ableiten oder als 1D-Array von Spaltenvektoren sehen, oder nur eine Matrix-Klasse schreiben und wenn man einen Vektor braucht eben eine entsprechend dimensionierte Matrix (eben nur eine Spalte) dafür verwenden?

- Zum Bilden der Inverse einer Matrix: Gibt es Verfahren, die nummerisch möglischst stabil sind?1.) Eigenwerte können komplexe Zahlen sein, inwieweit daß deine Fragestellung berührt weiß ich nicht.
An sich sollte es nur wenig Mehrarbeit sein (abgesehen von der Implementation Komplexer Zahlen, aber das wirst du wohl noch öfter brauchen ;-)), die Matritzen auch so zu implementieren, daß du komplexe Werte nutzen kannst.
2.) Ich würde eine Matrixklasse schreiben, und Vektoren als 1xn bzw nx1-Fall nutzen.
3.) Ja, lehnen sich an den Gauß-Algorithmus an, sind aber auch dementsprechend langsam (iirc O(n^3)). Sie sind dann nicht nur stabil, sondern exakt.
Oder ging es dir bei diese Frage um die Fehler durch die Ungenaugkeit aufgrund der Endlichkeit der fp-Formate?

mfg Sebastian

Coda
2005-11-08, 17:33:46
2.) Ich würde eine Matrixklasse schreiben, und Vektoren als 1xn bzw nx1-Fall nutzen.Das funktioniert aber nicht, weil das Dot-Product z.B. nicht auf Matrizen definiert ist.

Pinoccio
2005-11-08, 18:12:31
Das funktioniert aber nicht, weil das Dot-Product z.B. nicht auf Matrizen definiert ist.Ähm, doch!
Das Dot-Produkt ist ganz normale Matrix-Multipikation! (http://de.wikipedia.org/wiki/Matrix_%28Mathematik%29#Matrixmultiplikation) Auf Deutsch heißt es übrigens Skalarprodukt. ;-)

mfg Sebastian

micki
2005-11-09, 08:42:02
Ähm, doch!
Das Dot-Produkt ist ganz normale Matrix-Multipikation! (http://de.wikipedia.org/wiki/Matrix_%28Mathematik%29#Matrixmultiplikation) Auf Deutsch heißt es übrigens Skalarprodukt. ;-)

mfg Sebastian
wenn, dann wäre es ein matrixprodukt, ein skalarprodukt, wie der name schon sagt, hat eine skalare zahl als resultat, genau so wie ein vectorprodukt einen vektor als resultat hat.

btw. eine matrix die keine inverse hat, hat dies indirekt deswegen, weil die determinante 0 ist -> die division durch 0 nicht definiert ist. ansonsten ist eine matrix invertierbar. wenn man komplexe zahlen einbaut, dann dürfte das an der invertierbarkeit einer matrix nicht sonderlich viel ändern.

MFG
micki

DocEW
2005-11-09, 09:33:18
- Zum Bilden der Inverse einer Matrix: Gibt es Verfahren, die nummerisch möglischst stabil sind?
Weiß ja nicht, wie sehr es wirklich eine "Fingerübung" sein soll und nichts mit der Praxis zu tun hat. Aber hier mal ein Zitat aus dem Buch "Numerische Mathematik I":
Es gab über lange Zeit die offene Wette eines wissenschaftlich hochkarätigen Kollegen, der eine hohe Summe darauf setzte, dass in praktischen Fragestellungen niemals das Problem der "Invertierung einer Matrix" unvermeidbar auftritt. Soweit bekannt, hat er seine Wette in allen Einzelfällen gewonnen.
Meistens ist halt einfach "nur" die Lösung linearer Gleichungssysteme gefragt. Mit der Invertierung einer Matrix löst du quasi das Gleichungssystem für alle rechte Seiten, was u.U. viel Schwieriger und "bösartiger" sein kann.

Für das Lösen linearer Gleichungssysteme ist das CG-Verfahren (http://de.wikipedia.org/wiki/CG-Verfahren) glaube ich eines der schnellsten, stabilsten und relativ einfach zu implementieren.

Pinoccio
2005-11-09, 12:38:51
wenn, dann wäre es ein matrixprodukt, ein skalarprodukt, wie der name schon sagt, hat eine skalare zahl als resultat, genau so wie ein vectorprodukt einen vektor als resultat hat.

btw. eine matrix die keine inverse hat, hat dies indirekt deswegen, weil die determinante 0 ist -> die division durch 0 nicht definiert ist. ansonsten ist eine matrix invertierbar. wenn man komplexe zahlen einbaut, dann dürfte das an der invertierbarkeit einer matrix nicht sonderlich viel ändern.Mathematisch sind das Skalarprodukt zweier Vektoren und die Matrixmutliplikation zwei verschiedene Dinge, ja.
Aber wenn wir das kanonische Skalarprodukt betrachten, dann ist es vom Rechenweg her identisch zur Matrixmultiplikation. Wenn wir Vektoren als 1xn-Matritzen betrachten erhalten wir als Ergebnis eine 1x1-Matrix, die wir gemeinhin als Skalar auffassen können bzw sogar nicht wirklich von einem Skalar unterscheiden können.

Was die Invertierbarkeit betrifft, so könnte man sich jetzt über die Gründe streiten, ob erst die Determinante =0 war und dann die Matrix nicht invertierbar ist oder andersrum.
IMHO ist eine Matrix zuallererst nicht invertierbar und dann ist ihre Determinante gleich null und alle anderen Eigenschaften. Wie man das sieht, hängt vermutlich stark von der Herangehensweise ab, aber das wird hier ot.
Verwendung komplexer Einträge ändert daran aber in der Tat nichts.

mfg Sebastian

Coda
2005-11-09, 21:38:33
Ähm, doch!
Das Dot-Produkt ist ganz normale Matrix-Multipikation! (http://de.wikipedia.org/wiki/Matrix_%28Mathematik%29#Matrixmultiplikation)Urks. Ich meinte natürlich das Kreuzprodukt...

Auf Deutsch heißt es übrigens Skalarprodukt. ;-)Das weiß ich selber.

ScottManDeath
2005-11-10, 00:43:50
Ich würde getrennte Vektor und Matrizenklassen machen, aufgrund von Typsicherheit eventuell auch Zeilen- und Spaltenvektoren getrennt. Man mag zwar versucht sein, Vektoren als 1xN Matrizen anzusehen, aber was macht man dann mit Dingen wie z.b. Länge eines Vektors, oder Normalisieren. Dies sollte bei einer Matrix nicht möglich sein, bei einem Vektor schon.

Das ist das gleiche wie eine Ellipse und einem Kreis, ein Kreis ist zwar eine Ellipse mit beiden Radien gleich, aber ein ein Kreis hat z.b. Eine GetRadius Methode, welche bei einer Ellipse keine sinnvolle Bedeutung hat. Deswege sollten Kreis und Ellipse von einer gemeinsamen Shape Klasse abgeleitet werden, und nicht voneineander.

ethrandil
2005-11-10, 01:06:18
Ich würde getrennte Vektor und Matrizenklassen machen, aufgrund von Typsicherheit eventuell auch Zeilen- und Spaltenvektoren getrennt. Man mag zwar versucht sein, Vektoren als 1xN Matrizen anzusehen, aber was macht man dann mit Dingen wie z.b. Länge eines Vektors, oder Normalisieren. Dies sollte bei einer Matrix nicht möglich sein, bei einem Vektor schon.
wieso? Wenn Vektor von 1xn matric erbt kann er doch 'ne getLength()-Methode dazubekommen?

Das ist das gleiche wie eine Ellipse und einem Kreis, ein Kreis ist zwar eine Ellipse mit beiden Radien gleich, aber ein ein Kreis hat z.b. Eine GetRadius Methode, welche bei einer Ellipse keine sinnvolle Bedeutung hat. Deswege sollten Kreis und Ellipse von einer gemeinsamen Shape Klasse abgeleitet werden, und nicht voneineander.
Kreis erbt von Ellipse und bekommt eine eigene Methode. wieder kein Problem.

Ich fürchte du hast dein Beispiel verdreht ;)

- Eth

ScottManDeath
2005-11-10, 10:27:53
wieso? Wenn Vektor von 1xn matric erbt kann er doch 'ne getLength()-Methode dazubekommen?


Angenommen, Du hast Deine Matrix mit einer SetNumberOfRows() und einer SetNumberOfColumns() Methode sowie einer GetNumberOfElements Methode(), um eben dynamische Größen zu unterstützen. Dann leitest Du Deinen Vektor davon ab, fügst u.U. Methoden dazu.

Die Vererbung drückt aus, dass ein Vektor eine spezielle Art von Matrix ist, und dass an jeder Stelle, wo eine Matrix erwartet wird, ein Vektor stehen kann.

Was machst Du in folgendem Fall

void DoStuff(Matrix& m)
{
m.SetNumberOfRows(4);
m.SetNumberOfColumns(4);
assert(16 == m.GetNumberOfElements());
// bei Matrix ok, aber was macht der Vektor?
// wenn true rauskommst, hast Du keinen Vektor mehr, da er nicht mehr 1xN bzw. Nx1 ist
// wenn Du eine Exception in den SetMethoden wirfst,
// dann ist Vektor keine Matrix mehr, das das Interface verletzt wurde ;)
}

Matrix& m1 = Matrix();
Matrix& m2 = Vector();

DoStuff(m1);
DoStuff(m2);




Kreis erbt von Ellipse und bekommt eine eigene Methode. wieder kein Problem.

Ich fürchte du hast dein Beispiel verdreht ;)

- Eth

Naja, guck Dir das (http://davidhayden.com/blog/dave/archive/2005/06/10/1226.aspx)mal an. Zugegeben, das mit der GetRadius Methode war etwas daneben.

Wichtig ist, dass abgeleitete Klassen die gleichen Invarianzen haben, wie die Basisklasse. Das ist in meinen Beispielen nicht gegeben, und sollte ein Zeichen dafür sein, dass Vererbung manchmal doch nicht der Heilge Gral ist. ;)

DocEW
2005-11-10, 10:40:42
ScottManDeath, das Problem (Matrix/Vector) tritt aber nur auf, wenn du die Größe dynamisch änderbar machen willst, oder? Denn dadurch kann sich halt die Klassenzugehörigkeit ändern.
Das ist wahrscheinlich generell eine schlechte Idee: Eigenschaften änderbar machen, die die Klassenzugehörigkeit bestimmen. Oder andersrum: Klassen aufgrund von änderbaren Eigenschaften definieren.

ScottManDeath
2005-11-10, 19:24:11
ScottManDeath, das Problem (Matrix/Vector) tritt aber nur auf, wenn du die Größe dynamisch änderbar machen willst, oder? Denn dadurch kann sich halt die Klassenzugehörigkeit ändern.
Das ist wahrscheinlich generell eine schlechte Idee: Eigenschaften änderbar machen, die die Klassenzugehörigkeit bestimmen. Oder andersrum: Klassen aufgrund von änderbaren Eigenschaften definieren.

Ja, klar. Ich würde wohk N und M als template/generic Parameter machen und das ganze statisch lassen.