Matrixmultiplikation

clemensum

Mitglied
Hallo Javaprogrammierer! :)

Auch wenn das folgende nur indirekt mit der JAVA-Programmierung zu tun hat, ist dieses Forum scheints der richtige Ort für diese Aufgabe:
Es geht u.a. darum, zwei Matrizen zu multiplizieren. Ich habe nun drei Schleifen programmiert und bin diese mehrmals mit Schreibtischtest durchgegangen und es hat immer mit dem wahren Multiplikationswert zusammengepasst. Führe ich jedoch das Programm aus, dann kommen nicht mehr dir richtigen Werte heraus! :(

Wisst ihr vielleicht woran das liegt, wo ein Fehler in der Schleife liegen könnte?

Java:
public ComplexMatrix mult(ComplexMatrix a) {
		int m = this.size()[0];
		int n = this.size()[1];
		int r = a.size()[1];
		int i = 0;
		int j = 0;
		int k = 0;
		Complex elementprodmatrix = new Complex(0, 0);
		ComplexMatrix produktmatrix = new ComplexMatrix(m, r);

		elementprodmatrix = elementprodmatrix.add(this.get(i, j).mul(
				a.get(j, k)));

		while (i < m) {
			while (k < r) {
				while (j < n) {
					elementprodmatrix = elementprodmatrix.add(this.get(i, j)
							.mul(a.get(j, k)));
					produktmatrix.set(i,j,elementprodmatrix);
					j++;
				}
				j = 0;
				k++;
			}
			k = 0;
			i++;
		}
		return produktmatrix;
	}
 
S

SlaterB

Gast
Standard-Hinweis 1: ohne vollständiges Programm mit Beispielmatrixen und allen drum und dran kann niemand was 'machen' außer Standard-Hinweise zu schreiben,
höchstens erleuchtet direkt im Code Fehler erkennen, was nicht immer passiert

Standard-Hinweis 2: wenn du schon den Schreibtischtest hast, dann logge doch im Programm Schritt für Schritt was passiert,
ob genauso die Zeilen und Spalten durchgegangen werden, was sind die Zwischenwerte, wie wächst die Summe?,
du kannst das 1:1 verfolgen und jede Abweichung komfortabel erkennen,
Debugger oder System.out.println()
 

Dekker

Bekanntes Mitglied
Warum keine for-Schleifen?

Zu Mainstream. So machts ja jeder :lol:

Ne aber mal ernsthaft, wo sollen wir den da jetzt den Fehler finden? Was passiert vor allem in den Kernzeilen genau?

Java:
elementprodmatrix = elementprodmatrix.add(this.get(i, j)
                            .mul(a.get(j, k)));
                    produktmatrix.set(i,j,elementprodmatrix);
                    j++;
 

clemensum

Mitglied
Die Kernzeilen sind für diese Betrachtung egal, es kann nur in den Schleifen ein Fehler sein, weil sich das Programm fehlerfrei ausführen lässt. Es gibt irgendwie ein Variablenproblem, jedoch ist dies eben schwer mit dm Schreibtischtest zu entdecken. Wenn ihr es nicht findet, werde ich es mit System.out probieren müssen! :rtfm:
 

clemensum

Mitglied
Zum Code:

Java:
/**
 * @author Elias Lazar
 * 
 */
public class ComplexMatrix {

	private Complex[][] elemente;

	/**
	 * Konstruktor erzeugt n*n Matrix und versichert, dass Zeilenanzahl positiv
	 * ist.
	 * 
	 * @param n
	 */
	public ComplexMatrix(int n) {
		assert n > 0 : "Eine quadr. Matrix mit keinen oder weniger Spalten ist unsinng!";
		this.elemente = new Complex[n][n];
		int i = 0, j;
		while (i < n) {
			j = 0;
			while (j < n) {
				this.set(i, j, new Complex(0.0, 0.0));
				j++;

			}
			i++;
		}

	}

	/**
	 * Konstruktor für eine belieibige n*m Matrix, wobei Zeilenanzahl nicht
	 * gleich Spaltenanzahl gelten muss.
	 * 
	 * @param rows
	 * @param cols
	 */
	public ComplexMatrix(int rows, int cols) {
		int i = 0, j;
		this.elemente = new Complex[rows][cols];
		while (i < rows) {
			j = 0;
			while (j < cols) {
				this.set(i, j, new Complex(0.0, 0.0));
				j++;
			}
			i++;
		}

	}

	/**
	 * Konstruktor für eine Matrix mit zufälligen Einträgen.
	 * 
	 * @param n
	 * @return fertige Zufallsmatrix
	 */
	public static ComplexMatrix random(int n) {
		ComplexMatrix randommatrix = new ComplexMatrix(n);
		int i = 0, j;
		while (i < n) {
			j = 0;
			while (j < n) {
				randommatrix.set(
						i,
						j,
						new Complex(Math.floor(Math.random() * 10), Math
								.floor(Math.random() * 10)));
				j++;
			}
			i++;
		}
		return randommatrix;

	}

	// public int[] size(){
	// int[] size = new int[2];
	// this.elemente[0] = this.elemente.length;
	// this.elemente[1] = this.elemente[0].length;
	// return size;
	// }

	/**
	 * Methode zum Aufruf der Größe der Matrix. Das Array enthält Anzahl der
	 * Zeilen und Anzahl der Spalten.
	 * 
	 * @return die Größe der Matrix
	 */
	public int[] size() {
		int[] size = new int[2];

		size[0] = this.elemente.length;
		size[1] = this.elemente[0].length;
		return size;
	}

	/**
	 * Methode zum Aufruf des Eintrags der Matrix an der Stelle (r,c)
	 * 
	 * @param r
	 * @param c
	 * @return das Element an der entsprechenden Stelle in de Matrix
	 */
	public Complex get(int r, int c) {
		return this.elemente[r][c];
	}

	// setze Element (r,c) auf den Wert d in der this Matrix
	/**
	 * Methode weist der Stelle (r,c) einen konkreten Wert zu.
	 * 
	 * @param r
	 * @param c
	 * @param d
	 */
	public void set(int r, int c, Complex d) {
		this.elemente[r][c] = d;
	}

	/**
	 * Zwei komplexe Matrizen werden miteinander addiert.
	 * 
	 * @param a
	 * @return fertige Matrix mit den addierten Einträgen.
	 */
	public ComplexMatrix add(ComplexMatrix a) {

		int m = this.size()[0];
		int n = this.size()[1];
		int ma = a.size()[0];
		int mb = a.size()[1];
		assert m == ma : "Die Zeilenanzahl der zu addierenden Matrix muss gleich der ursprüng. sein. ";
		assert n == mb : "Die Spaltenanzahl der zu addierenden Matrix muss gleich der ursprüng. sein. ";
		ComplexMatrix summenmatrix = new ComplexMatrix(m, n);
		int i = 0, j;
		while (i < m) {
			j = 0;
			while (j < n) {
				summenmatrix.set(i, j, this.get(i, j).add(a.get(i, j)));
				j++;
			}
			i++;
		}
		return summenmatrix;
	}

	/**
	 * Methode multipliziert die Einträge zweier Matrizen
	 * 
	 * @param a
	 * @return Multiplikationsmatrix, d.h. Matrix mit entsprechend
	 *         multiplizierten Einträgen
	 */
	public ComplexMatrix mult(ComplexMatrix a) {
		int m = this.size()[0];
		int n = this.size()[1];
		int r = a.size()[1];
		int i = 0;
		int j = 0;
		int k = 0;
		Complex elementprodmatrix = new Complex(0, 0);
		ComplexMatrix produktmatrix = new ComplexMatrix(m, r);

		elementprodmatrix = elementprodmatrix.add(this.get(i, j).mul(
				a.get(j, k)));

		while (i < m) {
			while (k < r) {
				while (j < n) {
					elementprodmatrix = elementprodmatrix.add(this.get(i, j)
							.mul(a.get(j, k)));
					produktmatrix.set(i,j,elementprodmatrix);
					j++;
				}
				j = 0;
				k++;
			}
			k = 0;
			i++;
		}
		return produktmatrix;
	}

	public ComplexMatrix mult(Complex a) {
		int m = this.size()[0];
		int n = this.size()[1];
		ComplexMatrix prodmatrix = new ComplexMatrix(m, n);

		int i = 0, j;
		while (i < m) {
			j = 0;
			while (j < n) {
				prodmatrix.set(i, j, a.mul(this.get(i, j)));
				j++;

			}
			i++;
		}

		return prodmatrix;

	}

	public ComplexMatrix(Complex[][] ccontent) {
		int rows = ccontent.length;
		int cols = ccontent[0].length;
		this.elemente = new Complex[rows][cols];
		int i = 0;
		int j;
		while (i < rows) {
			j = 0;
			while (j < cols) {
				this.set(i, j, ccontent[i][j]);
				j++;

			}
			i++;
		}
	}

	public String toString() {
		int m = this.size()[0];
		int n = this.size()[1];
		String matrixString = " ";
		int i = 0;
		int j;
		while (i < m) {
			matrixString = matrixString + "(";
			j = 0;
			while (j < n) {
				matrixString = matrixString + this.get(i, j) + " ";

				j++;
			}
			i++;
			matrixString = matrixString + ")\n";

		}
		return matrixString;
	}

}






Java:
public class ComplexMatrixTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ComplexMatrix A = ComplexMatrix.random(3);
		ComplexMatrix B = ComplexMatrix.random(3);
	

		System.out.println("Matrix A = \n" + A.toString());
		System.out.println("Matrix B = \n" + B.toString());
		System.out.println(" Matrix A+B = \n " + A.add(B).toString());
		System.out.println("Matrix A*B =  \n " + A.mult(B).toString());
		Complex m = new Complex(5, 7);
		Complex n = new Complex(8, 9);
		Complex o = new Complex(10, 11);
		Complex l = new Complex(22, 33);

		Complex[][] ccontent = { { m, n }, { o, l } };
		ComplexMatrix e = new ComplexMatrix(ccontent);
		Complex[][] dcontent = { { l, l }, { l, l }, { m, n } };
		ComplexMatrix d = new ComplexMatrix(dcontent);

		System.out.println("Matrix c= \n" + e.toString());
		System.out.println("Matrix d= \n " + d.toString());
		System.out.println(" Matrix a*d = \n" + e.mult(d).toString());
		// System.out.println("c\n ist quadratisch = " + c.isSquare());

	}

}



Java:
/**
 * @author Elias Lazar
 *
 */
public class Complex {
	private double realteil, imaginärteil;

	Complex(double a, double b) {
		realteil = a;
		imaginärteil = b;
	}

	Complex(double a) {
		realteil = a;
		imaginärteil = 0;
	}

	Complex() {
		realteil = 0;
		imaginärteil = 0;
	}

	//Complex(Complex c) {
		//realteil = 0;
		//imaginärteil = b;
	//}

	
	
	/** Methode für die Summe zweier komplexer Zahlen 
	 * @param other
	 * @return die Summe zweier Komplexzahlen
	 */
	public Complex add(Complex other) {
		Complex compsum = new Complex();
		compsum.realteil = this.realteil + other.realteil;
		compsum.imaginärteil = this.imaginärteil + other.imaginärteil;
		return compsum;
	}

	/** Addiert eine Komplexe Zahl mit einem Realteil einer anderen kompl. Zahl
	 * @param real
	 * @return Die Summe in Gestalt einer komplexen Zahl
	 */
	public Complex add(double real) {
		Complex compsum = new Complex();
		compsum.realteil = this.realteil + real;
		compsum.imaginärteil = this.imaginärteil;
		return compsum;
	}

	
	
	/** Subtrahiert von einer komplexen Zahl eine reelle Zal 
	 * 
	 * @param real
	 * @return das Ergebnis der Subtraktion in Gestalt einer kompl. Zahl 
	 */
	public Complex sub(double real) {
		Complex compsub = new Complex();
		compsub.realteil = this.realteil - real;
		compsub.imaginärteil = this.imaginärteil;
		return compsub;
	}

	
	/** Sutrahiert zwei rein-komplexe Zahlen miteinander 
	 * @param other
	 * @return das Ergebnis in Form einer rein. kompl. Zahl 
	 */
	public Complex sub(Complex other) {
		Complex compsub = new Complex();
		compsub.realteil = this.realteil + other.realteil;
		compsub.imaginärteil = -this.imaginärteil - other.imaginärteil;
		return compsub;

	}

	/** Multipliziert zwei komplexe Zahlen miteinander 
	 * @param other
	 * @return das Ergebnis der Multiplikation 
	 */
	public Complex mul(Complex other) {
		Complex compmul = new Complex();
		compmul.realteil = this.realteil * other.realteil - this.imaginärteil
				* other.imaginärteil;
		compmul.imaginärteil = this.realteil * other.imaginärteil
				+ this.imaginärteil * other.realteil;
		return compmul;
	}

	/** Multipliziert komplexe Zahl mit einer reellen. 
	 * @param real
	 * @return das Ergebis der Mult. in Gestalt einer kompl. Zahl 
	 */
	public Complex mul(double real) {
		Complex compmul = new Complex();
		compmul.realteil = this.realteil * real;
		compmul.imaginärteil = this.imaginärteil * real;
		return compmul;
	}

	/** Dividiert eine komplexe Zahl durch eine andere. 
	 * @param other
	 * @return Ergebis der Division in Form von einer kompl Zahl mit rat. Koeffizienten
	 */
	public Complex div(Complex other) {
		Complex compdiv = new Complex();
		compdiv.realteil = (this.realteil * other.realteil + this.imaginärteil
				* other.imaginärteil)
				/ (other.realteil * other.realteil + other.imaginärteil
						* other.imaginärteil);
		compdiv.imaginärteil = (this.imaginärteil * other.realteil - this.realteil
				* other.imaginärteil)
				/ (other.realteil * other.realteil + other.imaginärteil
						* other.imaginärteil);
		return compdiv;
	}

	/** Dividiert eine komplexe Zahl durch eine reelle		
	 * @param real
	 * @return Das Ergebnis der Division in Gestalt einer kompl. Zahl. 
	 */
	public Complex div(double real) {
		Complex compdiv = new Complex();
		compdiv.realteil = this.realteil / real;
		compdiv.imaginärteil = this.imaginärteil / real;
		return compdiv;

	}

	public double abs() {
		double absbetrag = this.realteil * this.realteil + this.imaginärteil
				* this.imaginärteil;
		return absbetrag;

	}

	 /** Berechnet den Winkel zwischen der entsprechenden Geraden auf der Gauß'schen Zahlebene bezüglich der Realteilachse.
	 * @return  Winkel 
	 */ 
	public double arg(){
	double argument = Math.atan(this.imaginärteil/this.realteil);
	 return argument;
	 }

	
	
	public String toString() {
		String beschr = new String();
		if(imaginärteil>=0 ) { 
		 beschr = (this.realteil + "+"   +  this.imaginärteil
				+ "i");}
		else {
			 beschr = new String(this.realteil +  ""     +  this.imaginärteil
					+ "i");}
			return beschr; }

	/** Überprüft  das Ergebis des Programms mit dem des wahren auf Gleichheit    
	 * @param other
	 * @return Wahrheitswert - ob die Ergebisse übereinstimmen oder nicht
	 */
	public boolean equals(Complex other){
	Complex wahresthis = new Complex();
	Complex wahresother = new Complex();
	if((wahresthis.realteil == wahresother.realteil) && (wahresother.imaginärteil == wahresthis.imaginärteil ))
		return true;
	else return false; }

	}



Java:
public class ComplexTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Complex a = new Complex(5,3);
		Complex b = new Complex(2,-1);
		Complex c = new Complex(5,0);
		Complex d = new Complex(-6,-6);
	Complex x = new Complex();
	x = a.div(b);
	Complex lösung = new Complex(7/5,11/5);
	System.out.println("Ergebnis: " + x.toString() );	
	assert x.equals(lösung): "Complexarithmetik fehlerhaft, falsche Ergebnisse!! ";
	
	x= a.mul(b);
	assert x.equals(lösung): "Complexarithmetik fehlerhaft, falsche Ergebnisse!! ";
	
	x= a.add(b);
	assert x.equals(lösung): "Complexarithmetik fehlerhaft, falsche Ergebnisse!! ";
	double x_1= a.abs();
	assert x.equals(lösung): "Complexarithmetik fehlerhaft, falsche Ergebnisse!! ";
	x= a.sub(b);
	assert x.equals(lösung): "Complexarithmetik fehlerhaft, falsche Ergebnisse!! ";
	double x_2=a.arg();
	assert x.equals(lösung): "Complexarithmetik fehlerhaft, falsche Ergebnisse!! ";
	
	
	}

	
	
}
 
S

SlaterB

Gast
wie absolut klar ist es doch eigentlich, dem Code erklärende Worte beizugeben, etwa dass es anscheinend vor allem um die Zeile

> System.out.println(" Matrix a*d = \n" + e.mult(d).toString());

geht? und wie logisch ist es doch, die eigenen Erkenntnisse, die auf dem Papier erwarteten Ergebnisse auch zu posten,
aber nein..

-----

streiche Zeile 10 im Code ganz am Anfang und ersetze Zeile 19 + 20 durch
Complex elementprodmatrix = get(i, j).mul(a.get(j, k));
besser?

edit: nein auch nicht, alles in drei Schleifen zu durchlaufen und für verschiedene k den Wert bei i,j mehrfach zu überschreiben kann keinen Sinn machen,
du musst gewiss doch mehrere Werte zusammenaddieren und diese dann gemeinsam speichern

edit2:
setze i und j nach außen, wenn i und j feststeht dann exakt einmal den Wert für dieses i,j-Paar ausrechnen, gern mit einer dritten Schleife wenn nötig, und einmal speichern
 
Zuletzt bearbeitet von einem Moderator:

lisi

Neues Mitglied
Ich würde gerne eine Frage zur Darstellung der komplexen Matrizen stellen. Die Ausgabe stimmt mit meinem Code gar nicht..die Einträge stehen in einer Reihe und die Matrix ist darunter aber leer.

Java:
public String toString()
		{
			String s = new String ();
			
			for(int i = 1; i <= rows; i++)
			{
				s += "( ";
				
				for(int j = 1; j <= cols; j++)
				{
					System.out.print(matrix[i-1][j-1]);
					if(j < cols)
						s += ", ";
				}
				
				if(i < rows)
					s += ")\n";
				else
					s += ")";
			}
			
			return s;
		}

wäre super, wenn mir jemand helfen könnte :)
 
S

SlaterB

Gast
du solltest in Zeile 11 nicht System.out.print verwenden sondern die Daten dort zu s hinzufügen?

new String ()
nie irgendwo schreiben, "" erreicht dasselbe
 

Landei

Top Contributor
Zuallererst ist String-Addition hier völlig daneben, nimm einen [c]StingBuilder[/c].

Dann sollten die Indizes nullbasiert sein, das macht die Sache einfacher. Wobei man hier eigentlich überhaupt keine Indizes braucht.

Einen Fehler sehe ich eigentlich nicht so direkt beim drüberschauen.

Irgendwie so (aus'm Kopp - ohne Gewähr)
Java:
public String toString() {
   StringBuilder sb = new StringBuilder();
   for(Complex[] row : matrix) {
        sb.append("( ");
        for(Complex c : row) {
            sb.append(c).append(", ");
        }
        sb.setLength(sb.length() - 2); //letztes Komma entfernen
        sb.append(")\n");
   } 
   return sb.toString();  
}
 

Ähnliche Java Themen

Neue Themen


Oben