5.7 Das Java-Matrixpaket Jama
Als zweiten Schwachpunkt haben wir ausgemacht, dass leistungsstarke Bibliotheken für Java fehlen. Inwieweit diese in die Standardbibliothek integriert sein müssen, bliebe dabei noch zu diskutieren, jedenfalls sind die zwei Klassen BigInteger und BigDecimal nicht besonders viel. (Obwohl zur Ehrenrettung gesagt werden muss, dass bei FORTRAN auch fast alles in externen, zum Teil recht teuren, kommerziellen Bibliotheken steht.) Über Universitäten und Firmen sind allerdings eine Vielzahl von Speziallösungen verfügbar, die dieses Loch stopfen. Auch bei der 3D-API von Sun ist ein Matrixpaket dabei, welches aber nur die einfachsten Matrixoperationen berechnet, darunter etwa die Grundoperationen mit Matrizen. Da aber Matrixoperationen auch für viele Wirtschafts- und Wissenschaftsbereiche wichtig sind, soll an dieser Stelle das Paket Jama vorgestellt werden, das es mit Matrizen aufnimmt. Das Paket ist eine Entwicklung von MathWorks und dem National Institute of Standards and Technology (NIST) und liegt als freie Referenzimplementierung vor, die Sun später als Standardbibliothek anbieten soll. Zusätzlich zu der Matrixklasse als Teil von Jama haben das NIST und die Universität von Maryland das Paket Jampack als alternativen Ansatz für Matrixberechnungen entwickelt, um den es hier aber nicht gehen soll.
Die Jama-Bibliothek (http://math.nist.gov/javanumerics/jama/) besteht im Wesentlichen aus sechs Klassen: Matrix, CholeskyDecomposition, LUDecomposition, QRDecomposition, SingularValueDecomposition und EigenvalueDecomposition. Es ist schön zu sehen, dass auch deutsche Wörter hin und wieder Eingang in wissenschaftliche Begriffe finden. Die Matrixklasse bietet neben grundlegenden Matrixoperationen, die sich auch in der 3D-API befinden, zusätzliche Methoden zur Lösung linearer Gleichungssysteme, zur Determinantenberechnung und zur Berechnung der Inversen einer Matrix an. Die übrigen Klassen erlauben eine Cholesky-Zerlegung, eine LU- und QR-Zerlegung und die Berechnung der Eigenwerte. Als Einschränkung rechnet Jama bisher nur mit reellen Zahlen, es ist jedoch eine Erweiterung auf komplexe Matrixelemente geplant. Hier sind sich die Entwickler jedoch bei der Realisierung noch nicht sicher, da saubere Objektorientierung und Effizienz Hand in Hand gehen sollen. Intern ist die Implementierung mit zweidimensionalen Feldern gelöst. Diese Form führt jedoch zu einem großen Speicherproblem bei dünn besiedelten Matrizen. Ebenso wird auch bei Dreiecksmatrizen keine besondere Implementierung verwendet. All dieses bedenken aber die Entwickler und wollen es in späteren Versionen nachliefern. ##Nun ja, das Datum der letzten Änderung der Web-Seite ist der 23. Juni 1999 (Stand Ende 2002) ...
Um die Leistungen von Jama zusammenzufassen, hier eine Liste der Funktionen:
|
Objektmanipulation
Elemente der Matrix setzen und auslesen, Matrizen kopieren |
|
Elementare Operationen
Addition, Subtraktion, Multiplikation, Multiplikation mit einem Skalar, elementweise Multiplikation, elementweise Division, unäres Minus, Transponierung, Norm |
|
Zerlegungen
Cholesky, LU, QR, SVD, symmetrischer und nichtsymmetrischer Eigenwert |
|
Lösen von Gleichungssystemen
Lösung nichtsingulärer Gleichungen, kleinste Quadrate |
|
Sonstiges
Determinante, Rang, Inverses, Pseudo-Inverses |
Beispiel Lösen eines einfachen linearen Gleichungssystems mit Jama. Die folgenden Zeilen berechnen die Lösung der Gleichung Ax = b bei einem zufällig erzeugten b.
double m[][] = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
Matrix A, b, x ;
A = new Matrix( m );
b = Matrix.random( 3,1 );
x = A.solve( b );
Matrix residual = A.times(x).minus(b);
double rnorm = residual.normInf();
Das Ergebnis lässt sich mit toString() ermitteln. normInf() berechnet die Unendlich-Norm, die das größte Element der Matrix bezeichnet.
|
|