Dans cet exemple, l'entrée est deux matrices de toute taille m * n, n * m, et la sortie est le produit des deux matrices. Lors du calcul de la multiplication des matrices de taille arbitraire, l'algorithme Strassen est utilisé. Le programme est auto-écrit et testé, n'hésitez pas à l'utiliser. L'algorithme de base est:
1. Pour la matrice carrée (matrice carrée), trouvez le plus grand L, tel que l = 2 ^ k, k est un entier et l <m. La matrice carrée avec la longueur latérale L utilise l'algorithme Strassen, et le reste et les parties manquantes de la matrice carrée utilisent la méthode de force brute.
2. Pour la matrice non carré, ajoutez 0 selon la ligne et la colonne pour en faire une matrice carrée.
Strassenmethodtest.java
Package Matrixalgorithme; import java.util.scanner; classe publique StrassenMethodTest {private StrassenMethod StrassenMultiply; StrassenMethodTest () {strassenMultiply = new StrassenMethod (); } // end Cons public static void main (String [] args) {Scanner input = new Scanner (System.in); System.out.println ("Taille de ligne d'entrée de la première matrice:"); int emerge = input.nextint (); System.out.println ("Taille de la colonne d'entrée de la première matrice:"); int acol = input.nextint (); System.out.println ("Taille de ligne d'entrée de la deuxième matrice:"); int Browser = input.Nextint (); System.out.println ("Taille de la colonne d'entrée de la deuxième matrice:"); int bcol = input.nextint (); double [] [] a = nouveau double [arow] [acol]; double [] [] b = nouveau double [front] [bcol]; double [] [] c = nouveau double [arow] [bcol]; System.out.println ("Données d'entrée pour la matrice A:"); / * Dans tous les codes plus tard dans ce projet, R signifie la ligne tandis que C signifie la colonne. * / for (int r = 0; r <arow; r ++) {for (int c = 0; c <acol; c ++) {System.out.printf ("Données d'un [% d] [% d]:", r, c); A [r] [c] = input.NextDouble (); } // End Inner Loop} // End Loop System.out.println ("Données d'entrée pour la matrice B:"); pour (int r = 0; r <navigateur; r ++) {pour (int c = 0; c <bcol; c ++) {System.out.printf ("Données d'un [% d] [% d]:", r, c); B [r] [c] = input.nextDouble (); } // End Inner Loop} // End Loop StrassenMethodTest Algorithm = new StrassenMethodTest (); C = algorithm.MultiplyrectMatrix (a, b, come, acol, navigateur, bcol); // Afficher le résultat de calcul: System.out.println ("Résultat de la matrice C:"); pour (int r = 0; r <arow; r ++) {for (int c = 0; c <bcol; c ++) {System.out.printf ("Données de C [% d] [% d]:% f / n", r, c, c [r] [c]); } // End Inner Bloop} // End Outter Bloop} // End Main // traite des matrices qui ne sont pas carrées: public double [] [] multiplyrectMatrix (double [] [] a, double [] [] b, int arow, int acol, int browser, int bcol) {if (arow! = bcol) // invalid multiplicate new nouveau) double [] [] {{0}}; double [] [] c = nouveau double [arow] [bcol]; if (arow <acol) {double [] [] newa = new double [acol] [acol]; double [] [] newb = new double [Brow] [Brow]; int n = acol; pour (int r = 0; r <acol; r ++) pour (int c = 0; c <acol; c ++) newa [r] [c] = 0,0; pour (int r = 0; r <navigateur; r ++) pour (int c = 0; c <navigateur; c ++) newb [r] [c] = 0,0; pour (int r = 0; r <navigateur; r ++) pour (int c = 0; c <bcol; c ++) newb [r] [c] = b [r] [c]; Double [] [] C2 = MultiplySquareMatrix (Newa, NewB, N); pour (int r = 0; r <arow; r ++) pour (int c = 0; c <bcol; c ++) c [r] [c] = c2 [r] [c]; } // end if else if (arow == acol) c = multiplysquarematrix (a, b, approche); else {int n = arow; double [] [] newa = new double [arow] [arow]; double [] [] newb = new double [bcol] [bcol]; pour (int r = 0; r <arow; r ++) pour (int c = 0; c <arow; c ++) newa [r] [c] = 0,0; pour (int r = 0; r <bcol; r ++) pour (int c = 0; c <bcol; c ++) newb [r] [c] = 0,0; pour (int r = 0; r <arow; r ++) pour (int c = 0; c <acol; c ++) newa [r] [c] = a [r] [c]; pour (int r = 0; r <brow; r ++) pour (int c = 0; c <bcol; c ++) newb [r] [c] = b [r] [c]; Double [] [] C2 = MultiplySquareMatrix (Newa, NewB, N); pour (int r = 0; r <arow; r ++) pour (int c = 0; c <bcol; c ++) c [r] [c] = c2 [r] [c]; } // End Else Retour C; } // Méthode de fin // traite des matrices qui sont des matrices carrées. public double [] [] MultiplySquareMatrix (double [] [] a2, double [] [] b2, int n) {double [] [] c2 = nouveau double [n] [n]; pour (int r = 0; r <n; r ++) pour (int c = 0; c <n; c ++) c2 [r] [c] = 0; if (n == 1) {c2 [0] [0] = a2 [0] [0] * b2 [0] [0]; retour C2; } // end si int exp2k = 2; while (exp2k <= (n / 2)) {exp2k * = 2; } // boucle de fin if (exp2k == n) {c2 = strassenmultiply.strAssenMultiplyMatrix (a2, b2, n); retour C2; } // End Else // La "plus grande" matrice strassen: double [] [] [] a = nouveau double [6] [exp2k] [exp2k]; double [] [] [] b = nouveau double [6] [exp2k] [exp2k]; double [] [] [] c = nouveau double [6] [exp2k] [exp2k]; pour (int r = 0; r <exp2k; r ++) {pour (int c = 0; c <exp2k; c ++) {a [0] [r] [c] = a2 [r] [c]; B [0] [r] [c] = b2 [r] [c]; } // End End Inner Loop} // End Outter Loop C [0] = StrassenMultiply.StrassenMultiplyMatrix (A [0], B [0], exp2k); pour (int r = 0; r <exp2k; r ++) pour (int c = 0; c <exp2k; c ++) c2 [r] [c] = c [0] [r] [c]; int middle = exp2k / 2; for (int r = 0; r <middle; r ++) {for (int c = exp2k; c <n; c ++) {a [1] [r] [c - exp2k] = a2 [r] [c]; B [3] [r] [c - exp2k] = b2 [r] [c]; } // End End Inner Loop} // End Outter Loop for (int r = exp2k; r <n; r ++) {for (int c = 0; c <middle; c ++) {a [3] [r - exp2k] [c] = a2 [r] [c]; B [1] [r - exp2k] [c] = b2 [r] [c]; } // End End Inner Loop} // End Outter Loop for (int r = middle; r <exp2k; r ++) {for (int c = exp2k; c <n; c ++) {a [2] [r - middle] [c - exp2k] = a2 [r] [c]; B [4] [R - Middle] [C - EXP2K] = B2 [R] [C]; } // boucle intérieure end} // boucle d'extinction pour (int r = exp2k; r <n; r ++) {pour (int c = middle; c <n - exp2k + 1; c ++) {a [4] [r - exp2k] [c - middle] = a2 [r] [c]; B [2] [r - exp2k] [c - middle] = b2 [r] [c]; } // End End Inner Loop} // End Outter Bloop pour (int i = 1; i <= 4; i ++) c [i] = multiplyrectMatrix (a [i], b [i], middle, a [i] .length, a [i] .length, middle); / * Calculez les résultats finaux des grilles dans le "plus gros carré 2 ^ k, selon les règles de la multiplication matricielle. * / For (int row = 0; row <exp2k; row ++) {for (int col = 0; col <exp2k; col ++) {for (int k = exp2k; k <n; k ++) {c2 [row] [col] + = a2 [row] [k] [k] [k] [k] } // Boucle de fin} // Boucle interne de fin} // Boucle d'assurance finir // Utiliser la force brute pour résoudre le reste, sera améliorée plus tard: pour (int col = exp2k; col <n; col ++) {for (int row = 0; row <n; row ++) {for (int k = 0; k <n; k ++) c2 [row] [col] + = a2 [row] [k] B2 [k] [Row]; } // la boucle de fin de fin retour C2;} // Méthode de fin} // Classe de fin Strassenmethod.java
Package Matrixalgorithme; import java.util.scanner; classe publique strassenMethod {private double [] [] [] [] a = nouveau double [2] [2] [] []; Double privé [] [] [] [] b = nouveau double [2] [2] []; Double privé [] [] [] [] C = nouveau double [2] [2] []; / * // codes pour tester cette classe: public static void main (String [] args) {Scanner input = new Scanner (System.in); System.out.println ("Taille d'entrée de la matrice:"); int n = input.nextint (); double [] [] a = nouveau double [n] [n]; double [] [] b = nouveau double [n] [n]; double [] [] c = nouveau double [n] [n]; System.out.println ("Données d'entrée pour la matrice A:"); pour (int r = 0; r <n; r ++) {pour (int c = 0; c <n; c ++) {System.out.printf ("Données d'un [% d] [% d]:", r, c); A [r] [c] = input.NextDouble (); } // End Inner Loop} // End Loop System.out.println ("Données d'entrée pour la matrice B:"); pour (int r = 0; r <n; r ++) {pour (int c = 0; c <n; c ++) {System.out.printf ("Données d'un [% d] [% d]:", r, c); B [r] [c] = input.nextDouble (); } // End Inner Loop} // End Loop StrassenMethod Algorithm = new StrassenMethod (); C = algorithm.strassenmultiplymatrix (a, b, n); System.out.println ("Résultat de la matrice C:"); pour (int r = 0; r <n; r ++) {pour (int c = 0; c <n; c ++) {System.out.printf ("Données de C [% d] [% d]:% f / n", r, c, c [r] [c]); } // End End Inner Loop} // End Outter Bloop} // End Main * / public double [] [] strassenMultiplyMatrix (double [] [] a2, double b2 [] [], int n) {double [] [] c2 = nouveau double [n] [n]; // Initialisez la matrice: pour (int rowIndex = 0; RowIndex <n; RowIndex ++) pour (int colindex = 0; colindex <n; colindex ++) c2 [RowIndex] [colindex] = 0,0; if (n == 1) c2 [0] [0] = a2 [0] [0] * b2 [0] [0]; // "tranche des matrices en 2 * 2 parties: else {double [] [] [] [] a = nouveau double [2] [2] [n / 2] [n / 2]; double [] [] [] [] [] b = nouveau double [2] [2] [n / 2] [n / 2]; double [] [] [] [] [c = nouveau double [2] [2] [n / 2] [n / 2]; R <n / 2; r ++) {pour (int c = 0; c <n / 2; c ++) {a [0] [0] [r] [c] = a2 [r] [n / 2 + r] [c]; B [0] [0] [0] [R] [C] = B2 [R] [C]; B [0] [1] [R] [C] = B2 [R] [N / 2 + C]; B [1] [0] [R] [C] = B2 [N / 2 + R] } // Loop de fin N = n / 2; A [1] [1], n); A [1] [1], n); s [7] = addMatrix (b [1] [0], b [1] [1], n); Double [7] [N] [N]; P [0] = StrassenmultiplyMatrix (A [0] [0], S [0], n); StrassenMultiplyMatrix (A [1] [1], S [3], n); P [4] = StrassenMultiplyMatrix (S [4], S [5], n); C [0] [0] = AddMatrix (MINUSMATRIX (AddMatrix (P [4], P [3], n), P [1], n), P [5], n); MINUSMATRIX (MINUSMATRIX (AddMatrix (P [4], p [0], n), p [2], n), p [6], n); n * = 2; C2 [R] [N / 2 + C] = C [0] [1] [R] [C]; Loop intérieur} // End Outter Loop} // Ending Retour C2; C ++) C [R] [C] = A [R] [C] + B [R] [C]; = 0;J'espère que cet article sera utile à tout le monde d'apprendre la programmation Java.