Methoden Matrix Multiplikation

domme5599

Mitglied
Hallo,

ich hab ein Programm geschrieben, dass drei Matrizen erstellt und die Ergebnismatrix definiert. In einer weiteren Methode wird ohne Fehler Matrix A und B zu D addiert. In der Methode für die Multiplikation kompiliert er diese zwar ohne zu meckern, aber das Ergebnis ist völlig falsch.

Fehlerbeschreibung im Code

Java:
public class MatrixDouble {

        //Addiert, D = A+B
       public static void add(int[]D, int[]A, int[]B)    //übergeben der notwendigen Matrizen
        {
                for (int i=0; i<D.length; i++)       //Ergebnismatrix soll nicht länger sein als die definierte Länge
                        D[i] = A[i] + B[i];         //Addition von A und B
        }

    public static void mul(int[]D, int[]C, int[]B)   //übergeben der notwendigen Matrizen
        {
                for (int i=0; i<D.length; i++)         //Ergebnismatrix soll nicht länger sein als die definierte Länge
                        D[i] = C[i] * B[i];         //Multiplikation von C und B und genau hier glaube ich ist der Fehler oder in der Schleife darüber, da manuell ausgerechnet die Matrix lautet {36,40,68,76,100,112}
        }                         //und ausgeben wird die Matrix {8,10,10,13,15,13}
     
     
        //zur schönen Ausgabe
        public static void out(int[]matrix)
        {
                for (int i=0; i<matrix.length; i++)
                {
                        if ( i % (int)Math.sqrt(matrix.length) == 0 )
                                System.out.println();
                        System.out.print(matrix[i]+" ");
                }
                System.out.println();
        }



        public static void main (String args[])
        {
                int[] A = {1,2,3,4,5,6};             //Matrix A 3x2 wird erstellt
                int[] B = {7,8,9,10,11,12 };         //Matrix B 3x2 wird erstellt
        int[] C = {1,2,1,3,4,1,5,6,1};         //Matrix C 3x3 wird erstellt
                int[] D = new int[6];             //Ergebnismatrix D 3x2 wird definiert
 
                System.out.println();                 //A anzeigen
                System.out.println("Matrix A:");
                out(A);
             
                System.out.println();
                System.out.println("Matrix B:");     //B anzeigen
                out(B);

        System.out.println();
                System.out.println("Matrix C:");     //C anzeigen
                out(C);

                   System.out.println();
                System.out.println("Summe S=A+B:");  //Summe aus A und B anzeigen


        add(D, A, B);
             
                out(D);

      
                System.out.println();
                System.out.println("Produkt P=C*B:");        //Produkt aus C und B anzeigen


         add(D, C, B);
             
                out(D);
        }
}
 
Ich dachte dass die Multiplikation in Java relativ ähnlich umgesetzt werden kann wie Addition.

Java:
public static void mul(int[]D, int[]C, int[]B)  {
                            for (int i=0; i<D.length; i++)
                                         D[i] = C[i] * B[i];
                                                  }
 
Oh danke, dass habe ich mal völlig übersehen 🙂
Jetzt kommt die Matrix {7,16,9,30,44,12} raus, dass ist
schon ein besseres Ergebnis aber leider noch nicht richtig.

Java:
    System.out.println();
                System.out.println("Produkt P=C*B:");      //Produkt aus C und B anzeigen


         mul(D, C, B);
             
                out(D);
 
Zuletzt bearbeitet:
Es ist viele Jahre her dass ich Matrixenrechnung gelernt habe aber ich meine mich erinnern zu können, dass eine Multiplikation eben nicht einfach das Multipilizieren der einzelnen Werte ist oder?
 
Matrixmultiplikation ist nach dem Falkschema: erste Zeile A * erste Spalte B
erste Zeile A * zweite Spalte B
zweite Zeile A * erste Spalte B
zweite Zeile A * zweite Spalte B
dritte Zeile A * erste Spalte B
dritte Zeile A * zweite Spalte B

(In meinen Fall)

Ich denke aber mal, dass die Multiplikation nach Falk anders im Quellcode geschrieben werden muss.

Ich denke ich muss hier für die Multiplikation Spalte und Zeile einzeln definieren.
 
Zuletzt bearbeitet:
Matrixmultiplikation ist nach dem Falkschema: erste Zeile A * erste Spalte B
erste Zeile A * zweite Spalte B
zweite Zeile A * erste Spalte B
zweite Zeile A * zweite Spalte B
dritte Zeile A * erste Spalte B
dritte Zeile A * zweite Spalte B

(In meinen Fall)

Ich denke aber mal, dass die Multiplikation nach Falk anders im Quellcode geschrieben werden muss.

Ich denke ich muss hier für die Multiplikation Spalte und Zeile einzeln definieren.

Du must halt nur die entsprechenden Indizes verwenden. Wenn du immer i nimmst bekommst du natuerlich nur ein erste zeile * erste zeile und zweite zeile mal zweite zeile.
In diesem Fall müßtest du sowas haben wie

D = A[i+0] * B[i+1]

aber so einfach geht das natürlich nicht wenn du das für beliebig viele Dimensionen machen willst. Dann must Du die eine Formal dafür ausdenken.

Gruß

Claus
 
So ich hab jetzt ein bisschen weiter programmiert und den Code so geändert, dass die notwenigen Matrizen für die Multiplikation richtig definiert sind. Aus Zeitmangel habe ich nur die Multiplikation neu definiert und deswegen auch drei neue Matrizen definiert. Das letzte was denke ich fehlt ist die Abänderung in der main Methode, da dort c und d in Out noch als double[] definiert sind. Allerdings fehlt mir dazu noch die Idee.

Java:
public class MatrixDouble {

       public static void add(double[]D, double[]A, double[]B) {   //übergeben der notwendigen Matrizen
           
                for(int i=0; i<D.length; i++)       //Ergebnismatrix soll nicht länger sein als die definierte Länge

                        D[i] = A[i] + B[i];         //Addition von A und B
                }

    public static double[][] mul(double[][]d, double[][] c, double[][] b) {  //übergeben der notwendigen Matrizen
        for(int i=0; i<c.length; i++)
            for(int j=0; j<c.length; j++)         //Ergebnismatrix soll nicht länger sein als die definierte Länge
                d[i][j] = c[i][j] * b[j][i];     //Produkt von c und b
         return d;
            }
       
        public static void out(double[]matrix) {
       
                for(int i=0; i<matrix.length; i++) {
               
                        if( i % (int)Math.sqrt(matrix.length) == 0 )
                                System.out.println();
                        System.out.print(matrix[i]+" ");
                    }
                System.out.println();
        }



        public static void main (String args[]) {
       
                double[] A = {1,2,3,4,5,6};                     //Matrix A 3x2 wird erstellt
                double[] B = {7,8,9,10,11,12};                  //Matrix B 3x2 wird erstellt
                double[] D = new double[6];                      //Ergebnismatrix D 3x2 wird definiert
                double c[][] = {{1,2,1}, {3,4,1}, {5,6,1}};  //Matrix c 3x3 wird erstellt
                double b[][] = {{7,8,9}, {10,11,12}};        //Matrix b 3x2 wird erstellt
                double[][] d = new double[c.length][b[0].length]; //Matrix d 3x2 wird definiert
   
                System.out.println();                 //A anzeigen
                System.out.println("Matrix A:");
                out(A);
               
                System.out.println();
                System.out.println("Matrix B:");     //B anzeigen
                out(B);

                System.out.println();
                System.out.println("Matrix c:");     //c anzeigen
                out(c);

                   System.out.println();
                System.out.println("Summe S=A+B:");  //Summe aus A und B anzeigen

                add(D, A, B);
               
                out(D);

        
                System.out.println();
                System.out.println("Produkt P=c*b:");        //Produkt aus c und b anzeigen

                mul(d, c, b);

                out(d);

        }
}
 
Code:
 double[] A = {1,2,3,4,5,6};                    //Matrix A 3x2 wird erstellt
Genau genommen ist das nicht richtig. Du hast hier einen Vector der Länge 6, keine 3x2 Matrix
 
Ja die Matrizen für die Addition sind natürlich keine wirklichen, ich hab erstmal nur Vektoren erstellt.
In dem Fall passte das aber, da die Vektoren hier als die geplanten Matrizen auch ausgegeben werden.
Später schreibe ich auch diese zu richtigen Matrizen um.
 
Das Problem ist, dass Du eine Matrix einmal als 1D- und einmal als 2D-Array darstellst. Dabei nimmst Du in der out-Methode implizit an, dass im 1D-Fall für die nxm-Matrix gilt, dass die Zahl der Spalten der größten ganzen Zahl entspricht, die kleiner oder gleich der Wurzel aus n*m ist. Das ist ... suboptimal.

Du müsstest also add und out auf double[][] umschreiben.

Besser wäre es aber, Du würdest das Thema objekt-orientierter angehen.
 
So hab jetzt versucht alles auf double[][] umzuschreiben, dass funktioniert so weit auch, aber jetzt kommt das Problem, dass ich die Reihenfolge in der out Methode noch richtig hinkriegen muss, dass er auch wirklich alle Matrizenzeilen so ausgibt; 1,0 2,0
3,0 4,0
5,0 6,0

Aktuell haut er mir halt dadurch noch raus "Index 2 out of bounds for length 2"

Java:
public class MatrixDouble {

       public static void add(double[][]D, double[][]A, double[][]B) {   //übergeben der notwendigen Matrizen
           
                for(int i=0; i<D.length; i++)      
                    for(int j=0; j<D.length; j++)    //Ergebnismatrix soll nicht länger sein als die definierte Länge
                    D[i][j] = A[i][j] + B[i][j];         //Addition von A und B
                }

    public static double[][] mul(double[][]d, double[][] c, double[][] B) {  //übergeben der notwendigen Matrizen
        for(int i=0; i<c.length; i++)
            for(int j=0; j<c.length; j++)         //Ergebnismatrix soll nicht länger sein als die definierte Länge
                d[i][j] = c[i][j] * B[j][i];     //Produkt von c und b
         return d;
            }
       
        public static void out(double[][]matrix) {
       
                for(int i=0; i<matrix.length; i++) {
                     for(int j=0; j<matrix.length; j++) {
                        if( i % (int)Math.sqrt(matrix.length) == 0 )
                            if( j % (int)Math.sqrt(matrix.length) == 0 )
                           
                                System.out.println();
                        System.out.print(matrix[i][j]+" ");
                    }
                System.out.println();
            }
        }



        public static void main (String args[]) {
       
                double A[][] = {{1,2}, {3,4}, {5,6}};                     //Matrix A 3x2 wird erstellt
                double B[][] = {{7,8}, {9,10}, {11,12}};                  //Matrix B 3x2 wird erstellt
                double D[][] = new double[3][2];                      //Ergebnismatrix D 3x2 wird definiert
                double c[][] = {{1,2,1}, {3,4,1}, {5,6,1}};          //Matrix c 3x3 wird erstellt
                double d[][] = new double[3][2];     //Matrix d 3x2 wird definiert
   
                System.out.println();                 //A anzeigen
                System.out.println("Matrix A:");
                out(A);
               
                System.out.println();
                System.out.println("Matrix b:");     //b anzeigen
                out(B);

                System.out.println();
                System.out.println("Matrix c:");     //c anzeigen
                out(c);

                   System.out.println();
                System.out.println("Summe S=A+B:");  //Summe aus A und B anzeigen

                add(D, A, B);
               
                out(D);

        
                System.out.println();
                System.out.println("Produkt P=c*B:");        //Produkt aus c und b anzeigen

                mul(d, c, B);

                out(d);

        }
}
 
Ja ich nehme an du meinst diesen Teil und meinst Math.sqrt und der muss geändert werden.

Java:
if( i % (int)Math.sqrt(matrix.length) == 0 )
if( j % (int)Math.sqrt(matrix.length) == 0 )
 
Nicht nur hier, sondern z. B. auch hier
Java:
for(int i=0; i<D.length; i++)      
    for(int j=0; j<D.length; j++)    //
 
So jetzt der richtige Code wird alles ausgerechnet und ist alles auf double umgestellt.
Hat mich jz 2 Stunden gekostet zusätzlich um die richtige Ausgabe und mul Methode zu finden.
Das nächste was ich jetzt noch versuche ist die Multiplikation von Matrix A mit der konstanten Zahl 2.

Java:
class MatrixDouble{
    //Addition der Matrizen   
    public static double[][] add(double[][]a, double[][]b)  {        //Übergeben der notwenigen Matrizen
        double[][]d = new double[a.length][a[0].length];            //Ergebnismatrix erstellen
            for (int i=0; i<d.length; i++){                                   //Schleifen für die richtige Addition
                for (int j=0;j<d[i].length;j++)
                     d[i][j] = a[i][j] + b[i][j];                                 //Rechenoperation
                        }
                return d;
                }
    //Multiplikation der Matrizen   
    public static double[][] mul(double[][]a, double[][]c) {        //Übergeben der notwenigen Matrizen
        double[][] e = new double[a.length][c[0].length];            //Ergebnismatrix erstellen
            for(int i = 0; i < a.length; i++){                                 //Schleifen für die Matrixmultiplikation ich brauchte                                                                                                 drei Schleifen da Java sonst bei mir mit den                                                                                                         Spalten und Zeilen durcheinander kam
                for(int j = 0; j < c[0].length; j++) {               
                    for(int k = 0; k < a[0].length; k++) {
                        e[i][j] += a[i][k] * c[k][j];                           //Rechenoperation
                                }
          
                            }
                        }
                return e;
                }
               
  //Ausgabe der Matrizen
    public static void out(double[][]matrix) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j=0;j<matrix[i].length;j++)
                System.out.print(matrix[i][j]+ " ");
                System.out.println();
                }
            }

    public static void main(String[] args) {
 
     double[ ][ ]  matrixa = {{1,2,3},{4,5,6}};                    //Erstellen der Matrix A               
     double[ ][ ]  matrixb = {{7,8,9},{10,11,12}};              //Erstellen der Matrix B
     double[ ][ ]  matrixc = {{1,2,1},{3,4,1},{5,6,1}};       //Erstellen der Matrix C
     double[ ][ ]  matrixd = new double[3][2];                    //Matrix D = A+B
     double[ ][ ]  matrixe = new double[3][2];                    //Matrix E = A*C

     System.out.println("Matrix A:");                   
     out(matrixa);                                                //Aufrufen der Methode out für Matrix A
     System.out.println();
     System.out.println("Matrix B:");
     out (matrixb);                                                //Aufrufen der Methode out für Matrix B
     System.out.println();
     System.out.println("Matrix C:");
     out (matrixc);                                                //Aufrufen der Methode out für Matrix C
     System.out.println();
     System.out.println("D = A+B:");
     matrixd = add(matrixa, matrixb);                            //Definition D = A+B
     out(matrixd);                                                //Aufrufen der Methode out für Matrix D
     System.out.println();
     System.out.println("E = A*C:");
     matrixe = mul(matrixa, matrixc);                            //Definition E = A*C
     out(matrixe);                                                //Aufrufen der Methode out für Matrix E

 
  }
}
 
Die Multiplikation eines Skalars mit einer Matrix läuft ja eigentlich so ab:

Skalar = 2
Matrix A
/2*1 2*2 2*3\
\2*4 2*5 2*6/

Meine Überlegung ist hier, dass ich nicht drei Schleifen brauche wie bei der normalen Multiplikation, sondern nur noch max 2.
Der Code ist noch falsch da hier noch eine Nullmatrix rauskommt.
Ich muss halt überlegen wie ich richtig den festen Wert in diese Multiplikation einfüge.

Java:
public static double[][] skalmul(double[][]a, double skalar) {
                  double[][] f = new double[a.length][a [0].length];
                           for(int i = 0; i < a.length; i++){
                               for(int j = 0; j < a[0].length; j++)
                                    f[i][j] = a[i][j] * skalar;
                                       }
                           return f;
                         }
 
Der Vollständigkeit her kommt hier jetzt der funktionierende Code noch rein.
Danke für die Hilfe.

Java:
class MatrixDouble{
    //Addition der Matrizen   
    public static double[][] add(double[][]a, double[][]b)  {        //Übergeben der notwenigen Matrizen
        double[][]d = new double[a.length][a[0].length];            //Ergebnismatrix erstellen
            for (int i=0; i<d.length; i++){                            //Schleifen für die richtige Addition
                for (int j=0;j<d[i].length;j++)
                     d[i][j] = a[i][j] + b[i][j];                    //Rechenoperation
                        }
                return d;
                }
    //Multiplikation der Matrizen   
    public static double[][] mul(double[][]a, double[][]c) {        //Übergeben der notwenigen Matrizen
        double[][] e = new double[a.length][c[0].length];            //Ergebnismatrix erstellen
            for(int i = 0; i < a.length; i++){                        //Schleifen für die Matrixmultiplikation ich brauchte drei Schleifen da Java sonst bei mir mit den Spalten und Zeilen durcheinander kam
                for(int j = 0; j < c[0].length; j++) {               
                    for(int k = 0; k < a[0].length; k++) {
                        e[i][j] += a[i][k] * c[k][j];                //Rechenoperation
                                }
                            }
                        }
                return e;
                }
               
    public static double[][] skalmul(double[][]a, double[][]f) {    //Übergeben der notwenigen Matrizen
        for(int i = 0; i < a.length; i++){                            //Schleifen für die richtige Länge und die Ergebnismatrix
            for(int j = 0; j < a[0].length; j++)
                f[i][j] = a[i][j] * 2;                                //Rechenoperation mit dem festen Wert 2
                        }
                return f;
                }
                  
  //Ausgabe der Matrizen
    public static void out(double[][]matrix) {
        for (int i = 0; i < matrix.length; i++) {                    //Schleifen, dass alle Matrizen auch die richtigen Maße haben
            for (int j=0;j<matrix[i].length;j++)                   
                System.out.print(matrix[i][j]+ " ");                //Ausgabe der Matrix und zwischen jeder Matrixkomponente ein Leerzeichen
                System.out.println();
                }
            }

    public static void main(String[] args) {
 
     double[ ][ ]  matrixa = {{1,2,3},{4,5,6}};                    //Erstellen der Matrix A               
     double[ ][ ]  matrixb = {{7,8,9},{10,11,12}};                 //Erstellen der Matrix B
     double[ ][ ]  matrixc = {{1,2,1},{3,4,1},{5,6,1}};            //Erstellen der Matrix C
     double[ ][ ]  matrixd = new double[2][3];                  //Matrix D = A+B
     double[ ][ ]  matrixe = new double[2][3];                    //Matrix E = A*C
     double[ ][ ]  matrixf = new double[2][3];                    //Matrix F = A*2

     System.out.println("Matrix A:");                   
     out(matrixa);                                                //Aufrufen der Methode out für Matrix A
     System.out.println();
     System.out.println("Matrix B:");
     out (matrixb);                                                //Aufrufen der Methode out für Matrix B
     System.out.println();
     System.out.println("Matrix C:");
     out (matrixc);                                                //Aufrufen der Methode out für Matrix C
     System.out.println();
     System.out.println("D = A+B:");
     matrixd = add(matrixa, matrixb);                            //Definition D = A+B
     out(matrixd);                                                //Aufrufen der Methode out für Matrix D
     System.out.println();
     System.out.println("E = A*C:");
     matrixe = mul(matrixa, matrixc);                            //Definition E = A*C
     out(matrixe);                                                //Aufrufen der Methode out für Matrix E
     System.out.println();
     System.out.println("F = A*2:");
     matrixe = skalmul(matrixa, matrixf);                        //Definition F = A*2
     out(matrixf);                                                //Aufrufen der Methode out für Matrix F


 
  }
}
 

Zurück
Oben