001    package de.hska.java.aufgaben.felder;
002    
003    
004    /**
005     * Eine quadratische Matrix mit double-Werten.
006     * <p>
007     *   <a href="http://www.home.hs-karlsruhe.de/~pach0003/informatik_1/aufgaben/felder.html#matrix">Zurück zum Aufgabentext</a>
008     * </p>
009     * 
010     * @author Christian Pape
011     */
012    public class Matrix {
013    
014            private static final double [][] LEER = new double[0][0];
015            
016            private double [][] matrix = LEER;
017            
018            /**
019             * Erzeugt eine leere Matrix mit Dimension 0.
020             */
021            public Matrix() {       
022            }
023            
024            /**
025             * Erzeugt eine Matrix mit 0 Werten von der gegeben Dimension.
026             */
027            public Matrix(int dimension) {
028                    matrix = new double[dimension][dimension];
029            }
030            
031            /**
032             * Erzeugt eine neue Matrix mit den Werten aus
033             * dem gegeben zwei-dimensionalen Feld.
034             * Falls Zeile und Spalten des Felds unterschiedliche
035             * Länge haben, dann ist die erzeugte Matrix leer
036             * (Dimension 0).
037             * Falls matrix null ist, wird eine
038             * NullPointerException geworfen.
039             * 
040             * @param matrix Feld mit gleicher Anzahl Spalten und Zeilen
041             */
042            public Matrix(double [][] matrix) {
043                    for (double [] zeile : matrix) {
044                            if (zeile.length != matrix.length) {
045                                    return;
046                            }
047                    }
048                    
049                    this.matrix = new double[matrix.length][matrix.length];
050                    
051                    for (int zeile = 0; zeile < matrix.length; zeile++) {
052                            for (int spalte = 0; spalte < matrix.length; spalte++) {
053                                    this.matrix[zeile][spalte] = matrix[zeile][spalte];
054                            }
055                    }
056            }
057            /**
058             * Addierte diese Matrix zur gegebenen und gibt die
059             * Summe zurück. Falls die Dimensionen unterschiedlich
060             * sind, wird null zurückgegeben.
061             * Falls matrix null ist, wird eine
062             * NullPointerException geworfen.
063             * 
064             * @param matrix Matrix mit gleicher Dimension, wie diese Matrix
065             */
066            public Matrix addiere(Matrix matrix) {
067                    Matrix summe = new Matrix(LEER);
068                    
069                    if (getDimension() == matrix.getDimension()) {
070                            summe = new Matrix(this.matrix);
071                            for (int zeile = 0; zeile < getDimension(); zeile++) {
072                                    for (int spalte = 0; spalte < getDimension(); spalte++) {
073                                            summe.matrix[zeile][spalte] += matrix.matrix[zeile][spalte];
074                                    }
075                            }
076                    }
077                    
078                    return summe;
079            }
080            
081            /**
082             * Multipliziert diese Matrix mit der gegeben und
083             * gibt das Produkt zurück. Wenn die Dimensionen
084             * verschiedenen sind, dann wird die leere Matrix (Dimension 0)
085             * zurückgebeben. Falls matrix null ist, wird eine
086             * NullPointerException geworfen.
087             * 
088             * @param matrix Matrix mit gleicher Dimension, wie diese Matrix
089             */
090            public Matrix multipliziere(Matrix matrix) {
091                    Matrix produkt =  new Matrix(LEER);
092                    
093                    if (getDimension() == matrix.getDimension()) {
094                            produkt = new Matrix(getDimension());
095                            for (int zeile = 0; zeile < getDimension(); zeile++) {
096                                    for (int spalte = 0; spalte < getDimension(); spalte++) {
097                                            for (int i = 0; i < getDimension(); i++) {
098                                                    produkt.matrix[zeile][spalte] += this.matrix[zeile][i]
099                                                                                   * matrix.matrix[i][spalte];
100                                            }
101                                    }
102                            }
103                    }
104                    
105                    return produkt;
106            }
107            
108            /**
109             * Gibt die Dimension, das heisst die Anzahl Zeilen und Spalten,
110             * dieser Matrix zurück.
111             */
112            public int getDimension() {
113                    return matrix.length;
114            }
115            
116            
117            /**
118             * Gibt den Wert dieser Matrix an der Position
119             * (zeile,spalte) zurück. Falls zeile oder spalte
120             * nicht zwischen 0 und der Dimension liegen, dann
121             * wird eine IndexOutOfBoundsException geworfen.
122             * @param zeile 0 < zeile < getDimension()
123             * @param spalte 0 < spalte < getDimension()
124             */
125            public double getDouble(int zeile, int spalte) {
126                    return matrix[zeile][spalte];
127            }
128    }