Matrix-Vektor-Multiplikation

Rock'n

Mitglied
Hey Leute,

also ich muss ein Programm schreiben, welches das Produkt einer Symmetrischen Matrix und eines Vektors berechnet. Bis jetzt hab ich folgendes geschrieben:

Java:
	package algebra;
	 
	public class SymmetrischeMatrix {
	    
	    private double [][] koeffizientenFeld = null; 
	    
	    
	    private int anzahlZeilenUndSpalten;
	    
	     public SymmetrischeMatrix(int groesse) {
	          
	    	 this.anzahlZeilenUndSpalten = groesse;
	    	 
	    	 this.koeffizientenFeld = new double[groesse][];
	            
	    	 for (int j = 0; j < groesse; j++){
	    		 koeffizientenFeld[j] = new double[j+1];
	    	 }
	            
	          }
	    public int getGroesse (){
	    	return anzahlZeilenUndSpalten;
	    }
	     
	    public double getKoeffizient(int row, int col) {
	      
	        if (row >= col){
	        	return koeffizientenFeld [row][col];
	        }
	        else{
	        	 return koeffizientenFeld [col][row];
	        }
	    }
	    
	    public void setKoeffizient(int row, int col, double value){
	        if (row >= col){
	        	 koeffizientenFeld [row][col]=value;
	        }
	        else{
	        	  koeffizientenFeld [col][row]=value;
	        }
	    	
	    	
	    }
	    
	    
	    
	

}

Java:
package algebra;

public class Vektor {

	private double [] vektor;
	private int groesse;
	
	public Vektor(int groesse) {
		this.groesse = groesse;
		vektor = new double[groesse];
	}
	
	public void setKoeffizient(double wert, int stelle){
		vektor[stelle] = wert;
	}

	public double getKoeffizient(int stelle){
		return vektor[stelle];
	}
	@Override
	public String toString() {
		String ausgabe;
		ausgabe = "Vektor(";

		for (int i = 0; i < groesse; i++) {
		ausgabe += vektor[i];

		if (i < groesse-1) {
		ausgabe += ",";
		}
		}

		ausgabe += ")";
		return ausgabe;
		}

	public Vektor multiplizieren(SymmetrischeMatrix matrix) throws Exception {
		Vektor Ergebnisvektor;
		Ergebnisvektor = new Vektor (groesse);
			if (matrix.getGroesse() != groesse){
			throw new Exception("Größe nicht kompatibel");
		}
		for (int j = 0; j < groesse; j++){
			for (int i = 0; i < groesse; i++) {
				double Zwischenwert;
				Zwischenwert = Ergebnisvektor.getKoeffizient(j);
				Zwischenwert += matrix.getKoeffizient(j, i)*this.getKoeffizient(i);
				Ergebnisvektor.setKoeffizient(Zwischenwert, j);
			} 
			
		}
	
	
		
		return Ergebnisvektor;
	}
	
	
}

Java:
package programme;

import algebra.SymmetrischeMatrix;
import algebra.Vektor;

public class Prüfklasse {
	public static void main(String args[]) {
		
		SymmetrischeMatrix prüfmatrix1 = new SymmetrischeMatrix(4);
		Vektor prüfvektor1 = new Vektor(4);
		
		prüfvektor1.setKoeffizient(0.3, 0);
		prüfvektor1.setKoeffizient(0.2, 1);
		prüfvektor1.setKoeffizient(0.1, 2);
		prüfvektor1.setKoeffizient(0.0, 3);
		
		
		prüfmatrix1.setKoeffizient(0, 0, 1.0);
		prüfmatrix1.setKoeffizient(1, 0, -1.0);
		prüfmatrix1.setKoeffizient(1, 1, 2.0);
		prüfmatrix1.setKoeffizient(2, 0, 0.0);
		prüfmatrix1.setKoeffizient(2, 1, -1.0);
		prüfmatrix1.setKoeffizient(2, 2, 2.0);
		prüfmatrix1.setKoeffizient(3, 0, 0.0);
		prüfmatrix1.setKoeffizient(3, 1, 0.0);
		prüfmatrix1.setKoeffizient(3, 2, -1.0);
		prüfmatrix1.setKoeffizient(3, 3, 2.0);
		
		

		 try {
	    		System.out.println("Prüfmatrix1 * Vektor1 = ");
		    
	    		System.out.println(prüfvektor1.multiplizieren(prüfmatrix1));
		    } catch (Exception e) {
		      System.out.println(e);
		    }
		
	
	
	
	
}

leider stimmt das Ergebnis nicht. Könnt ihr mir vielleicht einen Hinweis geben was falsch ist?!

Danke!
 

Rock'n

Mitglied
Oh entschuldige ! Hatte nicht vor zweimal zu posten. Beim ersten Post hat sich mein PC aufgehangen und ich dachte es hätte gar nicht geklappt. Werde den einen nachher löschen.
Danke erstmal für den Link. Ich guck ihn mir an und versuche daraus schlau zu werden.
 

Rock'n

Mitglied
Also ich hab mir den Link durch gelesen und den Quellcode wie folgt geändert:
Java:
package algebra;

public class Vektor {

	private double [] vektor;
	private int groesse;
	
	public Vektor(int groesse) {
		this.groesse = groesse;
		vektor = new double[groesse];
	}
	
	public void setKoeffizient(double wert, int stelle){
		vektor[stelle] = wert;
	}

	public double getKoeffizient(int stelle){
		return vektor[stelle];
	}
	@Override
	public String toString() {
		String ausgabe;
		ausgabe = "Vektor(";

		for (int i = 0; i < groesse; i++) {
		ausgabe += vektor[i];

		if (i < groesse-1) {
		ausgabe += ",";
		}
		}

		ausgabe += ")";
		return ausgabe;
		}


	
	public Vektor multiplizieren(SymmetrischeMatrix matrix) throws Exception {
		Vektor Ergebnisvektor;
		Ergebnisvektor = new Vektor (groesse);
			if (matrix.getGroesse() != groesse){
			throw new Exception("Größe nicht kompatibel");
		}
		for (int i = 0; i < this.groesse; i++){
			double Zwischenwert=0;
			for (int j = 0; j < Ergebnisvektor.groesse; j++) {
				
				Zwischenwert += matrix.getKoeffizient(i, j)*this.getKoeffizient(j);
			}
				Ergebnisvektor.setKoeffizient(Zwischenwert, i);
			 
			
		}
	
	
	
	
		
		return Ergebnisvektor;
	}
	
	
}

Das Ergebnis bleibt falsch.
 

Rock'n

Mitglied
Ja klar… also ich hab die symmetrische matrix gegeben:

1 -1 0 0
-1 2 -1 0
0 -1 2 -1
0 0 -1 2

und den vektor:
0,3
0,2
0,1
0

wenn ich jetzt die Prüfklasse ausführen lasse kommt als Ergebnis dieser Vektor raus
Vektor(0.09999999999999998,2.7755575615628914E-17,0.0,-0.1)

aber meinen Berechnungen nach müsste eigentlich folgendes rauskommen:
(0.1, 0, 0, -0.1)


Jetzt hab ich leider gar keine Ahnung woran es liegt. Ist was bei der Methode zum multiplizieren falsch, bei der Klasse der Symmetrischen Matrix oder in der Prüfklasse oder ...?
 
T

trez

Gast
Wo ist das Problem, dein Resultat stimmt ja.

Das hat nicht direkt mit Java zu tun, sonder mit der Tatsache, dass float-Werte nicht präzise abgebildet werden können.
 

Rock'n

Mitglied
Entschuldige wenn ich jetzt so doof frage, aber ich hab leider nicht so viel Ahnung vom Programmieren.
Wieso meinst du, dass das Ergebnis richtig ist?
Vektor(0.09999999999999998,2.7755575615628914E-17,0.0,-0.1) ist doch nicht das gleiche wie
(0.1, 0, 0, -0.1). und vor allem was soll dieses "E" bei 2.7755575615628914E-17 ?
 

njans

Top Contributor
2.7755575615628914E-17 ist das selbe, wie 2.7755575615628914 * 10 ^(-17 ). E für Exponent.
Trez hat Recht für die 0.09999999999999998, diese entspricht 0.1, da die mathematische Genauigkeit von Gleitkommazahlen limitiert ist. Die 2,7... ist wohl definitiv falsch, ergo gibt es noch einen Fehler in deinem Programm.
 

Rock'n

Mitglied
okay, danke erstmal für die Erklärung… Aber wie du ja gesagt hast, scheint noch irgendwas falsch zu sein. Hat jemand vielleicht ne Idee was?
 

Gucky

Top Contributor
Du könntest alle Ergebnisse auf drei Nachkommastellen runden. Dann müsste das Richtige raus kommen. Zumindest da, wo die Genauigkeit am Fehler schuld ist.

Hast du schon mal debugged? Lass dir mal sämtliche Schritte mit Sysouts ausgeben oder verfolg die Schritte nach mit dem Debugger oder beides.
 

Rock'n

Mitglied
Was debugged ist weiß ich leider nicht :oops:
aber ich hab mir das alles als Sys.out geben lassen. Demnach scheint der Fehler hier:
Java:
Zwischenwert += matrix.getKoeffizient(i, j)*this.getKoeffizient(j);
zu sein.
Aber was ist daran falsch?
 

Rock'n

Mitglied
Entschuldige habe mir gerade nochmal nur die Variable "Zwischenwert" ausgeben lassen und hier scheint der Fehler zu liegen es wird folgendes ausgegeben:
0.0
0.3
0.09999999999999998
0.09999999999999998
0.0
-0.3
0.10000000000000003
2.7755575615628914E-17
0.0
0.0
-0.2
0.0
0.0
0.0
0.0
-0.1

aber eigentlich hatte ich den Zwischenwert ja gleich null gesetzt… wie kommt es dann dazu?
 

Gucky

Top Contributor
Woher sollen wir das wissen? :D Es ist dein Code. ;)

Statt eines Fisches gebe ich dir jetzt die Fähigkeit zu fischen.
Weißt du, was ein Bug ist? Debuggen ist die Tätigkeit, die man durchführt, um einen Bug zu entfernen.

Benutz mal den Debugger, um den Prozess nachzuvollziehen. Führ den Code zeilenweise aus und lass dir sämtliche Variablenbelegungen anzeigen und überprüf sie mit dem Wert, der darin stehen müsste.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
O Matrix, Vektor Java Basics - Anfänger-Themen 9
E Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 7
Z Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 13
I matrix aufgabe Java Basics - Anfänger-Themen 22
L Zweidimensionaler Array; n x m - Matrix überprüfuen Java Basics - Anfänger-Themen 35
C Matrix mit Array ausgeben Java Basics - Anfänger-Themen 6
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
F Adjunkte Matrix erstellen Java Basics - Anfänger-Themen 3
M Matrix Java Basics - Anfänger-Themen 3
F Matrix Multiplikation Java Basics - Anfänger-Themen 3
B Dünn besetzte Matrix Java Basics - Anfänger-Themen 7
Al3xand3r01 Matrix, Nachbarelemente Java Basics - Anfänger-Themen 16
E Rückwärtsmultiplikation einer invertierten matrix Java Basics - Anfänger-Themen 2
U Dreiecks-Matrix mit Array Java Basics - Anfänger-Themen 3
Z Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String) Java Basics - Anfänger-Themen 57
E 2D Array - char durch die Matrix "wandern" lassen Java Basics - Anfänger-Themen 7
M Matrix auf 4 Elemente untersuchen mit offenen Enden Java Basics - Anfänger-Themen 8
B Diskrete Faltung (Matrix) Randfälle Java Basics - Anfänger-Themen 8
M Matrix Elemente vergleichen Java Basics - Anfänger-Themen 11
N Quadratische Matrix inkl Summe Java Basics - Anfänger-Themen 8
J Methoden Moving a n integer matrix Java Basics - Anfänger-Themen 3
D Methoden Matrix Multiplikation Java Basics - Anfänger-Themen 27
H 2D Array, Symmetrische Matrix Java Basics - Anfänger-Themen 12
S Matrix spaltenweise befüllen Java Basics - Anfänger-Themen 1
T Zufällige Matrix in neue Matrix schreiben Java Basics - Anfänger-Themen 6
C Matrix-Werte werden nicht wie erwartet ausgegeben Java Basics - Anfänger-Themen 7
C Matrix erstellen Spaltensumme, Zeilensumme, Diagonale Java Basics - Anfänger-Themen 1
S Methoden Transponierte Matrix Java Basics - Anfänger-Themen 3
N Vererbung Submatrix mit Verweis auf Matrix erstellen Java Basics - Anfänger-Themen 9
J Matrix erstellen Java Java Basics - Anfänger-Themen 7
B Transponiertes Matrix Java Basics - Anfänger-Themen 12
J Überprüfen, ob eine 2D Matrix ein Baum ist Java Basics - Anfänger-Themen 5
C Matrix transponieren - Hilfe Java Basics - Anfänger-Themen 1
D Ausgabe einer Matrix mit System.out.println Java Basics - Anfänger-Themen 6
T Art 4 Felder Matrix Memory Java Basics - Anfänger-Themen 2
L Matrix(Array) minimieren... Java Basics - Anfänger-Themen 9
S eingegebene Matrix anzeigen Java Basics - Anfänger-Themen 4
J Matrix für Schachbrett Java Basics - Anfänger-Themen 6
G tga Datei lesen und in eine matrix umwandeln Java Basics - Anfänger-Themen 1
G Bilddaten in Matrix umwandeln Java Basics - Anfänger-Themen 1
T Eine String Matrix erstellen die eine boolean Funtion verwendet Java Basics - Anfänger-Themen 10
O Matrix Multiplizieren Java Basics - Anfänger-Themen 4
S LWJGL - Matrix vom Matrixstack laden Java Basics - Anfänger-Themen 3
T Matrix auf Symmetrie überprüfen Java Basics - Anfänger-Themen 6
V Matrix Transponieren Java Basics - Anfänger-Themen 3
V Methoden Matrix als 1D Array mit Werten füllen Java Basics - Anfänger-Themen 12
W Zweidimensionale Arrays als Matrix ausgeben Java Basics - Anfänger-Themen 8
O Matrix ordnen Java Basics - Anfänger-Themen 4
M Symmetrische Matrix Java Basics - Anfänger-Themen 2
W Methoden Rang von einer Matrix mit Gauss Java Basics - Anfänger-Themen 0
U Matrix Subtrahieren Java Basics - Anfänger-Themen 12
E Input/Output convert string to two dimensional char and output = matrix Java Basics - Anfänger-Themen 2
A daten vom 1d array in 2d matrix speichern Java Basics - Anfänger-Themen 3
I Matrix überprüfen Java Basics - Anfänger-Themen 8
K Methoden Einlesen einer unbegrenzten Matrix über Konsole Java Basics - Anfänger-Themen 6
O Einlesen einer Matrix von der Console Java Basics - Anfänger-Themen 18
N Matrix/Vektoren Java Basics - Anfänger-Themen 3
N Matrix Java Basics - Anfänger-Themen 14
T Methode, die eine 2 dimensionale Matrix kopiert. Java Basics - Anfänger-Themen 16
J Matrix Java Java Basics - Anfänger-Themen 3
D 2 mehrdimensionale Matrix einlesen Java Basics - Anfänger-Themen 2
A N*N Matrix Determinante berechnen Java Basics - Anfänger-Themen 47
K Quadratische Matrix um 90° drehen Java Basics - Anfänger-Themen 5
C Programm zur Berechnung der Spur einer Matrix Java Basics - Anfänger-Themen 4
B Zeilenumbruch (zweidim. Matrix) Java Basics - Anfänger-Themen 2
O Java Matrix mal Matrix über while Schleife... Java Basics - Anfänger-Themen 10
O Transponieren einer Matrix per While-Schleife Java Basics - Anfänger-Themen 3
M Matrix - Probelm Java Basics - Anfänger-Themen 7
O 2D Matrix befüllen mit geraden Zahlen!? Java Basics - Anfänger-Themen 14
J Java Matrix befüllen Java Basics - Anfänger-Themen 5
M Matrix Matrix Multiplikation Java Basics - Anfänger-Themen 6
F Matrix Java Basics - Anfänger-Themen 11
E Array als Matrix Java Basics - Anfänger-Themen 21
G OOP Parameter Matrix Java Basics - Anfänger-Themen 2
N Matrix Klasse Java Basics - Anfänger-Themen 4
B Maske an eine Matrix anpassen Java Basics - Anfänger-Themen 5
W Matrix übergeben Java Basics - Anfänger-Themen 7
T Matrix transponieren Java Basics - Anfänger-Themen 17
W Eine Methode schreiben, ob eine Matrix eine Diagonalmatrix ist.? Java Basics - Anfänger-Themen 3
M String Datei in Float-Matrix umwandeln Java Basics - Anfänger-Themen 8
D Problem: Werte eine Matrix vergleichen! Java Basics - Anfänger-Themen 5
B Matrix Java Basics - Anfänger-Themen 2
Semox Matrix multiplizieren Java Basics - Anfänger-Themen 4
N Matrix an toString Java Basics - Anfänger-Themen 7
C Diagonale in einem NxN Matrix Java Basics - Anfänger-Themen 6
F Einträgen von Matrix zu sotieren Java Basics - Anfänger-Themen 2
D JUnit auf Matrix anwenden Java Basics - Anfänger-Themen 5
J Spezielle Matrix ausgeben ! Java Basics - Anfänger-Themen 8
S Problem bei Matrix Addition Java Basics - Anfänger-Themen 5
F matrix werte übergeben Java Basics - Anfänger-Themen 5
M Hauptdiagonale Matrix berechnen Java Basics - Anfänger-Themen 6
M Klassenerstellung für Matrix mit Rechenopperationen Java Basics - Anfänger-Themen 42
D Matrix .bat datei erstellen und öffnen Java Basics - Anfänger-Themen 2
J Matrix ausgeben Java Basics - Anfänger-Themen 9
N Matrix Matrix Produkt Java Basics - Anfänger-Themen 7
N prüfe ob etwas in einer Matrix steht... Java Basics - Anfänger-Themen 14
L rechtecke zeichnen anhand von matrix Java Basics - Anfänger-Themen 27
J Matrix aus Datei einlesen mit StreamTokenizer Java Basics - Anfänger-Themen 3
K Transponiere Matrix Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben