In diesem Beispiel besteht der Eingang zwei Matrizen einer beliebigen Größe m*n, n*m und der Ausgang ist das Produkt der beiden Matrizen. Bei der Berechnung der Multiplikation beliebiger Größenmatrizen wird der Strassenalgorithmus verwendet. Das Programm ist selbst geschrieben und getestet. Bitte können Sie sie gerne verwenden. Der Grundalgorithmus lautet:
1. Für die quadratische Matrix (Quadratmatrix) finden Sie das größte L, so dass L = 2 ^ k eine Ganzzahl und L <m ist. Die quadratische Matrix mit Seitenlänge L verwendet den Strassenalgorithmus, und der Rest und fehlende Teile der Quadratmatrix verwenden die Brute -Kraft -Methode.
2. Fügen Sie für Nicht-Quadratmatrix 0 nach der Zeile und der Spalte hinzu, um eine quadratische Matrix zu machen.
StrassenMethodest.java
Paketmatrixalgorithmus; import Java.util.scanner; öffentliche Klasse Strassenmethodest {privat Strassenmethod Strassenmultiply; StrassenMethodTest () {StrassenMultiply = new StrassenMethod (); } // End Cons public static void main (String [] args) {scanner input = new scanner (System.in); System.out.println ("Eingabezeilegröße der ersten Matrix:"); int Emerge = input.Nextint (); System.out.println ("Eingabespaltengröße der ersten Matrix:"); int acol = input.nextint (); System.out.println ("Eingabezeilegröße der zweiten Matrix:"); int browser = input.nextint (); System.out.println ("Eingabespaltengröße der zweiten Matrix:"); int bcol = input.nextint (); double [] [] a = neues double [arow] [acol]; double [] [] B = neues double [Brow] [Bcol]; double [] [] c = neues double [arow] [bcol]; System.out.println ("Eingabedaten für Matrix a:"); /*In allen Codes später in diesem Projekt bedeutet R Zeile, während C -Spalte bedeutet. */ für (int r = 0; r <arow; r ++) {für (int c = 0; c <acol; c ++) {System.out.printf ("Daten von a [%d] [%d]:", r, c); A [r] [c] = input.NextDouble (); } // End Inner Loop} // Endschleifensystem.out.println ("Daten für Matrix B:"); für (int r = 0; r <browser; r ++) {für (int c = 0; c <bcol; c ++) {System.out.printf ("Daten von a [%d] [%d]:", r, c); B [r] [c] = input.nextDouble (); } // End Inner Loop} // Endschleife StrassenMethodtest Algorithmus = new StrassenMethodTest (); C = Algorithm.multiplyrectMatrix (a, b, come, acol, browser, bcol); // Zeigen Sie das Berechnungsergebnis an: System.out.println ("Ergebnis aus Matrix C:"); für (int r = 0; r <arow; r ++) {für (int c = 0; c <bcol; c ++) {System.out.printf ("Daten von c [%d] [%d]:%f/n", r, c, c [r] [c]); } // Ende der inneren Schleife} // Outter Loop} // Ende Main // mit Matrizen beenden, die nicht quadratisch sind: public double [] [] MultiplyrectMatrix (double [] [] a, double [] b, int arow, Int acol, Int Browser, int bcol) {wenn (arow! double [] [] {{0}}; double [] [] c = neues double [arow] [bcol]; if (arow <acol) {double [] [] newa = new Double [acol] [acol]; double [] [] newb = new Double [Brow] [Brow]; int n = acol; für (int r = 0; r <acol; r ++) für (int c = 0; c <acol; c ++) newa [r] [c] = 0,0; für (int r = 0; r <browser; r ++) für (int c = 0; c <browser; c ++) neub [r] [c] = 0,0; für (int r = 0; r <browser; r ++) für (int c = 0; c <bcol; c ++) neub [r] [c] = b [r] [c]; double [] [] C2 = MultiplySquarematrix (Newa, Newb, n); für (int r = 0; r <arow; r ++) für (int c = 0; c <bcol; c ++) c [r] [c] = c2 [r] [c]; } // end an sonst if (arow == acol) c = multiplySquarematrix (a, b, Ansatz); sonst {int n = arow; double [] [] newa = new Double [arow] [arow]; double [] [] newb = new double [bcol] [bcol]; für (int r = 0; r <arow; r ++) für (int c = 0; c <arow; c ++) newa [r] [c] = 0,0; für (int r = 0; r <bcol; r ++) für (int c = 0; c <bcol; c ++) neub [r] [c] = 0,0; für (int r = 0; r <arow; r ++) für (int c = 0; c <acol; c ++) newa [r] [c] = a [r] [c]; für (int r = 0; r <Brow; r ++) für (int c = 0; c <bcol; c ++) neub [r] [c] = b [r] [c]; double [] [] C2 = MultiplySquarematrix (Newa, Newb, n); für (int r = 0; r <arow; r ++) für (int c = 0; c <bcol; c ++) c [r] [c] = c2 [r] [c]; } // Ende sonst return c; } // Endmethode // mit Matrizen, die quadratische Matrizen sind, bearbeiten. public double [] [] multiplySquarematrix (double [] [] A2, double [] [] B2, int n) {double [] [] c2 = neues double [n] [n]; für (int r = 0; r <n; r ++) für (int c = 0; c <n; c ++) c2 [r] [c] = 0; if (n == 1) {c2 [0] [0] = a2 [0] [0] * B2 [0] [0]; Return C2; } // end, wenn int exp2k = 2; while (exp2k <= (n / 2)) {exp2k *= 2; } // Endschleife if (exp2k == n) {c2 = strassenmultiply.Strassenmultiplymatrix (a2, b2, n); Return C2; } // End else // die "größte" Strassen -Matrix: double [] [] [] a = neues double [6] [exp2k] [exp2k]; double [] [] [] b = neues double [6] [exp2k] [exp2k]; double [] [] [] c = neues double [6] [exp2k] [exp2k]; für (int r = 0; r <exp2k; r ++) {für (int c = 0; c <exp2k; c ++) {a [0] [r] [c] = a2 [r] [c]; B [0] [R] [C] = B2 [R] [C]; } // Ende der inneren Schleife} // Outter -Schleife C [0] = Strassenmultiply.Strassenmultiplymatrix (A [0], B [0], Exp2k); für (int r = 0; r <exp2k; r ++) für (int c = 0; c <exp2k; c ++) c2 [r] [c] = c [0] [r] [c]; int Middle = exp2k / 2; für (int r = 0; r <middle; r ++) {für (int c = exp2k; c <n; c ++) {a [1] [r] [c - exp2k] = a2 [r] [c]; B [3] [R] [c - exp2k] = b2 [r] [c]; } // End Inner Loop} // End -Outter -Schleife für (int r = exp2k; r <n; r ++) {für (int c = 0; c <Middle; c ++) {a [3] [r - exp2k] [c] = a2 [r] [c]; B [1] [r - exp2k] [c] = b2 [r] [c]; } // End Inner Loop} // End -Outter -Schleife für (int r = middle; r <exp2k; r ++) {for (int c = exp2k; c <n; c ++) {a [2] [r - Mitte] [c - exp2k] = a2 [r] [c]; B [4] [R - Mitte] [c - exp2k] = b2 [r] [c]; } // End Inner Loop} // End -Outter -Schleife für (int r = exp2k; r <n; r ++) {for (int c = Middle; c <n - exp2k+1; c ++) {a [4] [r - exp2k] [c - mittlere] = a2 [r] [c]; B [2] [r - exp2k] [c - Mitte] = B2 [R] [c]; } // Ende der inneren Schleife} // Outter -Schleife für (int i = 1; i <= 4; i ++) c [i] = multiplyrectMatrix (a [i], b [i], Mitte, a [i] .Length, a [i] .Length, Mitte); / * Berechnen Sie die endgültigen Ergebnisse von Grids im "größten 2^k -Platz gemäß den Regeln der Matrixmultiplikation. B2 [k] [col]; A2 [row] [k] * b2 [k] [row]; } // Innere Schleife} // Outter Loop Return C2; Strassenmethod.java
Paketmatrixalgorithmus; import Java.util.scanner; öffentliche Klasse StrassenMethod {private double [] [] [] [] A = New Double [2] [2] [] [] []; private double [] [] [] [] b = neues double [2] [2] []; private double [] [] [] [] c = neues double [2] [2] []; /*// Codes zum Testen dieser Klasse: public static void main (String [] args) {scanner input = new scanner (System.in); System.out.println ("Eingabematrix:"); int n = input.Nextint (); double [] [] a = neues double [n] [n]; double [] [] b = neues double [n] [n]; double [] [] c = neues double [n] [n]; System.out.println ("Eingabedaten für Matrix a:"); für (int r = 0; r <n; r ++) {für (int c = 0; c <n; c ++) {System.out.printf ("Daten von a [%d] [%d]:", r, c); A [r] [c] = input.NextDouble (); } // End Inner Loop} // Endschleifensystem.out.println ("Daten für Matrix B:"); für (int r = 0; r <n; r ++) {für (int c = 0; c <n; c ++) {System.out.printf ("Daten von a [%d] [%d]:", r, c); B [r] [c] = input.nextDouble (); } // End Inner Loop} // Endschleife StrassenMethod Algorithmus = new StrassenMethod (); C = Algorithm.Strassenmultiplymatrix (a, b, n); System.out.println ("Ergebnis aus Matrix C:"); für (int r = 0; r <n; r ++) {für (int c = 0; c <n; c ++) {System.out.printf ("Daten von c [%d] [%d]:%f/n", r, c, c [r] [c]); } // End Inner Loop} // End Outter Loop} // End Main*/public double [] [] StrassenMultiplymatrix (double [] [] A2, Double B2 [] [] [], int n) {double [] [] [] C2 = New Double [n] [n]; // Die Matrix initialisieren: für (int rowIndex = 0; rowIndex <n; rowIndex ++) für (int colindex = 0; colindex <n; colindex ++) c2 [rowIndex] [colindex] = 0,0; if (n == 1) C2 [0] [0] = A2 [0] [0] * B2 [0] [0]; // "Schneidenmatrizen in 2 * 2 Teile: sonst {double [] [] [] [] a = neues double [2] [2] [n / 2] [n / 2]; double [] [] [] [] [] B = neues Double [2] [2] [N / 2] [N / 2]; Double [] [] [] [] [2]. r <n / 2; B [0] [0] [R] [C] = B2 [R] [C]; } // Endschleife n = n/2; A [1] [1], n); minusmatrix (a [0] [1], A [1] [1], n); double [] [] [] p = neues double [7] [n] [n]; n); S [9], n); C [1] [1] = minusmatrix (minusmatrix (addmatrix (p [4], p [0], n), p [2], n), p [6], n); C [0] [0] [0] [R] [C]; C [1] [1] [R] [C]; n; für (int r = 0; r <n; r ++) für (int c = 0;Ich hoffe, dieser Artikel wird für alle hilfreich sein, um Java -Programme zu lernen.