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 }