Multiplikation von Matrix und Vektor

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!
 
Ich vermute du hast Zeilen und Spalten durcheinander gebracht. Ein Vektor hat eine Spalte und mehrere Zeilen, nicht umgekehrt.

Versuch mal das hier
Java:
for (int zeile = 0; zeile < groesse; zeile++){
    double Zwischenwert = 0;
    for (int spalte = 0; spalte < groesse; spalte++) {    
        Zwischenwert += matrix.getKoeffizient(zeile, spalte)*this.getKoeffizient(spalte);
    } 
    Ergebnisvektor.setKoeffizient(Zwischenwert, zeile);
}
 
Stimmt, bei genauerer Betrachtung gibt mein Code das selbe Ergebnis wie deiner.

Aber woher weisst du, dass das Ergebnis falsch ist? Und wieso setzt du nur 10 der 16 Koeffizienten?
 
Ich hab es handschriftlich nachgerechnet und daher weiß ich, dass das Ergebnis nicht stimmt.
Naja es handelt sich ja um eine symmetrische Matrix, deswegen dachte ich müsste es reichen wenn ich die Koeffizienten der linken Dreiecksmatrix einsetze.
 
Dann ist deine setKoeffizient Methode falsch. Du setzt da nur ein Feld in der Matrix. Du musst aber immer beide setzen.

Java:
public double getKoeffizient(int row, int col) {
    return koeffizientenFeld [row][col];
}

public void setKoeffizient(int row, int col, double value){
    koeffizientenFeld [row][col]=value;
    if (row != col){
        koeffizientenFeld [col][row]=value;
    }
}
 
Zuletzt bearbeitet:

Zurück
Oben