Dalam contoh ini, input adalah dua matriks dari segala ukuran m*n, n*m, dan output adalah produk dari dua matriks. Saat menghitung multiplikasi matriks ukuran sewenang -wenang, algoritma strassen digunakan. Program ini ditulis sendiri dan diuji, silakan gunakan. Algoritma dasarnya adalah:
1. Untuk matriks persegi (matriks persegi), temukan L terbesar, sedemikian rupa sehingga l = 2 ^ k, k adalah bilangan bulat dan l <m. Matriks persegi dengan panjang sisi L menggunakan algoritma strassen, dan bagian lain dan bagian yang hilang dari matriks persegi menggunakan metode brute force.
2. Untuk matriks non-square, tambahkan 0 sesuai dengan baris dan kolom untuk menjadikannya matriks persegi.
Strassenmethodtest.java
Paket Matrixalgorithm; impor java.util.scanner; kelas publik strassenmethodtest {private strassenmethod strassenmultiply; StrassenmethodTest () {strassenMultiply = new strassenMethod (); } // end cons public static void main (string [] args) {pemindai input = pemindai baru (system.in); System.out.println ("Ukuran baris input dari matriks pertama:"); int emerge = input.nextInt (); System.out.println ("Ukuran kolom input dari matriks pertama:"); int acol = input.nextInt (); System.out.println ("Ukuran baris input dari matriks kedua:"); int browser = input.nextInt (); System.out.println ("Ukuran kolom input dari matriks kedua:"); int bcol = input.nextInt (); Double [] [] a = Double baru [arow] [ACOL]; Double [] [] B = Double baru [alis] [BCOL]; Double [] [] c = Double baru [arow] [bcol]; System.out.println ("Input Data untuk Matriks A:"); /*Di semua kode nanti dalam proyek ini, R berarti baris sementara C berarti kolom. */ untuk (int r = 0; r <arow; r ++) {for (int c = 0; c <acol; c ++) {System.out.printf ("Data A [%d] [%d]:", r, c); A [r] [c] = input.nextdouble (); } // end loop bagian dalam} // end loop system.out.println ("Data input untuk matriks b:"); untuk (int r = 0; r <browser; r ++) {for (int c = 0; c <bcol; c ++) {System.out.printf ("Data A [%d] [%d]:", r, c); B [r] [c] = input.nextdouble (); } // Akhiri loop bagian dalam} // end loop strassenmethodtest algoritma = strassenmethodtest baru (); C = algoritm.multiplyrectmatrix (A, B, Come, Acol, Browser, BCOL); // Tampilkan hasil perhitungan: System.out.println ("Hasil dari matriks C:"); untuk (int r = 0; r <arow; r ++) {for (int c = 0; c <bcol; c ++) {System.out.printf ("Data c [%d] [%d]:%f/n", r, c, c [r] [c]); } // Akhir loop dalam} // end outter loop} // end Main // berurusan dengan matriks yang tidak persegi: public double [] [] multiplyrectmatrix (double [] [] a, double [] [] b, int arow, int acol, int browser, int bcol) {if (arow! = bcol) double [] [] {{0}}; Double [] [] c = Double baru [arow] [bcol]; if (arow <acol) {double [] [] newa = double baru [acol] [acol]; Double [] [] newB = double baru [alis] [brow]; int n = acol; untuk (int r = 0; r <acol; r ++) untuk (int c = 0; c <acol; c ++) newa [r] [c] = 0,0; untuk (int r = 0; r <browser; r ++) untuk (int c = 0; c <browser; c ++) newB [r] [c] = 0,0; untuk (int r = 0; r <browser; r ++) untuk (int c = 0; c <bcol; c ++) newB [r] [c] = b [r] [c]; ganda [] [] c2 = multiplysquarematrix (newa, newb, n); untuk (int r = 0; r <arow; r ++) untuk (int c = 0; c <bcol; c ++) c [r] [c] = c2 [r] [c]; } // Akhiri jika lain jika (arow == acol) c = multiplysquareMatrix (a, b, pendekatan); else {int n = arow; double [] [] newa = double baru [arow] [arow]; Double [] [] newB = double baru [bcol] [bcol]; untuk (int r = 0; r <arow; r ++) untuk (int c = 0; c <arow; c ++) newa [r] [c] = 0,0; untuk (int r = 0; r <bcol; r ++) untuk (int c = 0; c <bcol; c ++) newB [r] [c] = 0,0; untuk (int r = 0; r <arow; r ++) untuk (int c = 0; c <acol; c ++) newa [r] [c] = a [r] [c]; untuk (int r = 0; r <brow; r ++) untuk (int c = 0; c <bcol; c ++) newB [r] [c] = b [r] [c]; ganda [] [] c2 = multiplysquarematrix (newa, newb, n); untuk (int r = 0; r <arow; r ++) untuk (int c = 0; c <bcol; c ++) c [r] [c] = c2 [r] [c]; } // end else return c; } // Metode akhir // Berurusan dengan matriks yang merupakan matriks persegi. public double [] [] multiplysquareMatrix (double [] [] a2, double [] [] b2, int n) {double [] [] c2 = ganda baru [n] [n]; untuk (int r = 0; r <n; r ++) untuk (int c = 0; c <n; c ++) c2 [r] [c] = 0; if (n == 1) {c2 [0] [0] = A2 [0] [0] * B2 [0] [0]; mengembalikan C2; } // Akhiri jika int exp2k = 2; while (exp2k <= (n / 2)) {exp2k *= 2; } // end loop if (exp2k == n) {c2 = strassenmultiply.strassenmultiplymatrix (a2, b2, n); mengembalikan C2; } // end else // matriks strassen "terbesar": double [] [] [] a = double baru [6] [exp2k] [exp2k]; double [] [] [] b = double baru [6] [exp2k] [exp2k]; ganda [] [] [] c = Double baru [6] [exp2k] [exp2k]; untuk (int r = 0; r <exp2k; r ++) {for (int c = 0; c <exp2k; c ++) {a [0] [r] [c] = a2 [r] [c]; B [0] [r] [c] = b2 [r] [c]; } // Akhiri loop bagian dalam} // end outter loop c [0] = strassenmultiply.strassenmultiplymatrix (a [0], b [0], exp2k); untuk (int r = 0; r <exp2k; r ++) untuk (int c = 0; c <exp2k; c ++) c2 [r] [c] = c [0] [r] [c]; int middle = exp2k / 2; untuk (int r = 0; r <tengah; r ++) {untuk (int c = exp2k; c <n; c ++) {a [1] [r] [c - exp2k] = a2 [r] [c]; B [3] [r] [c - exp2k] = b2 [r] [c]; } // Akhiri loop bagian dalam} // end outter loop untuk (int r = exp2k; r <n; r ++) {for (int c = 0; c <tengah; c ++) {a [3] [r - exp2k] [c] = a2 [r] [c]; B [1] [r - exp2k] [c] = b2 [r] [c]; } // Akhiri loop bagian dalam} // end outter loop untuk (int r = tengah; r <exp2k; r ++) {for (int c = exp2k; c <n; c ++) {a [2] [r - tengah] [c - exp2k] = a2 [r] [c]; B [4] [r - tengah] [c - exp2k] = b2 [r] [c]; } // Akhiri loop dalam} // end outter loop untuk (int r = exp2k; r <n; r ++) {for (int c = tengah; c <n - exp2k+1; c ++) {a [4] [r - exp2k] [c - tengah] = a2 [r] [c]; B [2] [r - exp2k] [c - middle] = b2 [r] [c]; } // Akhiri loop bagian dalam} // end outter loop untuk (int i = 1; i <= 4; i ++) c [i] = multiplyrectmatrix (a [i], b [i], tengah, a [i] .length, a [i] .length, tengah); / * Hitung hasil akhir grid dalam "persegi 2^k terbesar, sesuai dengan aturan multiplikasi matriks. */ Untuk (int baris = 0; baris <exp2k; baris ++) {untuk (int col = 0; col <exp2k; col ++) {for (int k = exp2k; k <n; k ++) {c2) {for (int k = exp2k; k <n; k ++) {c2) [row] [int k = exp2k; k <n; K ++) {c2) [int k = exp2k; k <n; k ++) {c2) [col] [int k = K <n; k <n; K ++) {c2) [col] [int B2 [k] [col];} // end loop} // end loop bagian dalam} // end out loop // gunakan brute force untuk menyelesaikan sisanya, akan ditingkatkan nanti: untuk (int col = exp2k; col <n; col ++) {untuk (baris int = 0; baris <n; baris ++) {untuk (int K = 0 A2 [baris] [k] * b2 [k] [baris];} // end loop dalam} // end out loop untuk (int row = exp2k; baris <n; baris ++) {untuk (int col = 0; col <exp2k; col ++) {untuk (int k = 0; k <n; k ++) [col] [col] [col] [untuk (int k = 0; k <n; k ++) [col] [col] [col] [int (int k = 0; k <n; k ++) [col] [col] [col] [for = k = 0; k <n; } // Akhiri loop dalam} // end outter loop return c2; Strassenmethod.java
Paket Matrixalgorithm; impor java.util.scanner; strassenMethod kelas publik {private double [] [] [] [] a = double baru [2] [2] [] []; private double [] [] [] [] b = double baru [2] [2] []; private double [] [] [] [] c = double baru [2] [2] []; /*// Kode untuk menguji kelas ini: public static void main (string [] args) {pemindai input = pemindai baru (system.in); System.out.println ("Ukuran input matriks:"); int n = input.nextInt (); double [] [] a = Double baru [n] [n]; double [] [] b = double baru [n] [n]; double [] [] c = double baru [n] [n]; System.out.println ("Input Data untuk Matriks A:"); untuk (int r = 0; r <n; r ++) {untuk (int c = 0; c <n; c ++) {System.out.printf ("Data A [%d] [%d]:", r, c); A [r] [c] = input.nextdouble (); } // end loop bagian dalam} // end loop system.out.println ("Data input untuk matriks b:"); untuk (int r = 0; r <n; r ++) {untuk (int c = 0; c <n; c ++) {System.out.printf ("Data A [%d] [%d]:", r, c); B [r] [c] = input.nextdouble (); } // Akhiri loop dalam} // end loop strassenMethod algorithm = new strassenMethod (); C = algoritm.strassenmultiplymatrix (a, b, n); System.out.println ("Hasil dari matriks C:"); untuk (int r = 0; r <n; r ++) {for (int c = 0; c <n; c ++) {System.out.printf ("Data c [%d] [%d]:%f/n", r, c, c [r] [c]); } // Akhiri loop dalam} // end outter loop} // end Main*/public double [] [] strassenmultiplymatrix (double [] [] A2, double b2 [] [], int n) {double [] [] c2 = ganda baru [n] [n]; // inisialisasi matriks: untuk (int rowindex = 0; rowindex <n; rowindex ++) untuk (int colindex = 0; colindex <n; colindex ++) c2 [rowindex] [colindex] = 0,0; if (n == 1) c2 [0] [0] = A2 [0] [0] * B2 [0] [0]; //"Slice matrices into 2 * 2 parts: else{ double[][][][] A = new double[2][2][n / 2][n / 2]; double[][][][][] B = new double[2][2][n / 2][n / 2]; double[][][][][] C = new double[2][2][n / 2][n / 2]; for(int r = 0; r <n / 2; B [0] [0] [R] [C] = B2 [R] [C]; } // loop akhir n = n/2; A [1] [1], n); Minusmatrix (A [0] [1], A [1] [1], n); Double [] [] [] p = Double baru [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] [R] [C]; C [1] [1] [C]; n; untuk (int r = 0; r <n; r ++) untuk (int c = 0; c <n; c ++) c [r] [c] = a [r] [c] - b [r] [c];Saya harap artikel ini akan membantu semua orang untuk mempelajari pemrograman Java.