Verstehe den Bug nicht (Matrixmultiplikation)...



  • Hallo, da bin ich wieder!

    Ich versuche gerade mit einer Methode namens squareMatrix eine Matrix mit sich selbst zu multiplizieren (dynamicMatrix), jedoch bekomme ich nach der Ausfuehrung dieser Methode ein falsches Ergebnis raus.

    Zustand von dynamicMatrix vor der Ausfuehrung der squareMatrix-Methode:

    [0, 0, 1, 1]
    [1, 0, 1, 0]
    [1, 0, 0, 1]
    [0, 0, 1, 0]

    Zustand von dynamicMatrix nach der Ausfuehrung der squareMatrix-Methode:

    [1, 0, 3, 5]
    [3, 0, 10, 25]
    [2, 0, 43, 484]
    [2, 0, 308, 750755326]

    Der Code fuer den Test:

    // ...
        createMatrix(dynamicArray);
        System.out.println(java.util.Arrays.toString(dynamicMatrix[0]));
        System.out.println(java.util.Arrays.toString(dynamicMatrix[1]));
        System.out.println(java.util.Arrays.toString(dynamicMatrix[2]));
        System.out.println(java.util.Arrays.toString(dynamicMatrix[3]));
        squareMatrix();
        System.out.println(java.util.Arrays.toString(dynamicMatrix[0]));
        System.out.println(java.util.Arrays.toString(dynamicMatrix[1]));
        System.out.println(java.util.Arrays.toString(dynamicMatrix[2]));
        System.out.println(java.util.Arrays.toString(dynamicMatrix[3]));
    // ...
    

    Anmerkung: Ich darf nur java.lang und java.io verwenden sonst nichts.
    Ich habe hier ausnahmsweise java.util verwendet, das ich dan spaeter entfernen werde. Sie dient nur zum Testen.

    Der Code der Methode squareMatrix:

    // ...
    
      private static int[][] dynamicMatrix = new int[1][1]; // Wird durch eine Methode je nach Bedarf automatisch vergroessert.
    
    // ...
      public static void squareMatrix() {
        int matrixSize = countNumberOfVertices(dynamicArray); // Size of the quadratic matrix.
        for (int i = 0; i < matrixSize; ++i) {
          for (int j = 0; j < matrixSize; ++j) {
            for (int k = 0; k < matrixSize; ++k) {
              dynamicMatrix[i][j] += (dynamicMatrix[i][k] * dynamicMatrix[k][j]);
            }
          }
        }
      }
    // ...
    

    Das sollte eigentlich dabei rauskommen:

    1 0 1 1
    1 0 1 2
    0 0 2 1
    1 0 0 1

    Ich bin den Code mehrmals durchgegangen und ich verstehe nicht woran das liegt. 😕
    Es ist ja so, dass zunaechst i und j 0 sind und dann jeweils die Spalten bzw. Zeilen miteinander multipliziert werden bis zum letzten Eintrag der Spalte bzw. Zeile und alle diese Skalarmultiplikationen werden dann nacheinander addiert. Dann wird i und j auf 1 gesetzt und das "Spiel" wiederholt sich auf's Neue.

    Danke im Voraus!
    Guesse,
    jrookie16



  • Hab' etw. probiert und es klappt jetzt! Endlich! Nach stundenlangem gruebeln und rumprobieren.

    public static int[][] multiplyMatrixWith(int[][] secondMatrix) {
        int matrixSize = countNumberOfVertices(dynamicArray);
        int[][] bufferMatrix = new int[matrixSize][matrixSize];
        for (int i = 0; i < matrixSize; ++i) {
          for (int j = 0; j < matrixSize; ++j) {
            for (int k = 0; k < matrixSize; ++k) {
              bufferMatrix[i][j] += (dynamicMatrix[i][k] * secondMatrix[k][j]);
            }
          }
        }
        dynamicMatrix = bufferMatrix;
        return bufferMatrix;
      }
    

    Bin mir aber immer noch nicht sicher woran es lag...



  • Weil du versuchst, die Matrix in-place zu quadrieren und dabei die Einträge überschreibst und die Summe noch dazu nicht mit 0 beginnt, sondern schon vorinitialisiert ist:

    dynamicMatrix[i][j] += (dynamicMatrix[i][k] * dynamicMatrix[k][j]);
    

Anmelden zum Antworten