В этом примере вход представляет собой две матрицы любого размера m*n, n*m, а выход - продукт двух матриц. При расчете умножения произвольных матриц размера используется алгоритм Strassen. Программа самозаписывается и протестирована, пожалуйста, не стесняйтесь использовать. Основной алгоритм:
1. Для квадратной матрицы (квадратная матрица) найдите самый большой L, такой, что l = 2 ^ k, k - целое число и l <m. Алгоритм Strassen используется для квадратной матрицы с длиной L, а оставшиеся детали и отсутствующие детали в квадратной матрице являются грубой силой.
2. Для матрицы без квадрата добавьте 0 в соответствии с строкой и столбцом, чтобы сделать ее квадратной матрицей.
Strassenmethodtest.java
пакетный матриксльгоритм; импортировать java.util.scanner; открытый класс 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 («Размер входной строки первой матрицы:»); int emerge = input.nextint (); System.out.println («Размер входного столбца первой матрицы:»); int acol = input.nextint (); System.out.println («Размер входной строки второй матрицы:»); int browser = input.nextint (); System.out.println («Размер входного столбца второй матрицы:»); int bcol = input.nextint (); double [] [] a = new Double [arow] [acol]; double [] [] b = new Double [Brow] [bcol]; Double [] [] c = новый двойной [arow] [bcol]; System.out.println («Входные данные для матрицы A:»); /*Во всех кодах позже в этом проекте R означает строку, а C - столбец. */ for (int r = 0; r <arow; r ++) {for (int c = 0; c <acol; c ++) {System.out.printf («Данные a [%d] [%d]:", r, c); A [r] [c] = input.nextdouble (); } // End Inner Lo for (int r = 0; r <браузер; r ++) {for (int c = 0; c <bcol; c ++) {System.out.printf («Данные [%d] [%d]:", r, c); B [r] [c] = input.nextdouble (); } // End Inner Lo C = Algorithm.multiplyrectmatrix (a, b, come, acol, browser, bcol); // Отображение результата расчета: System.out.println («Результат из матрицы C:»); for (int r = 0; r <arow; r ++) {for (int c = 0; c <bcol; c ++) {System.out.printf ("Данные C [%d] [%d]:%f/n", r, c, c [r] [c]); } // end Внутренний цикл} // end Outter} // end Main // Работайте с матрицами, которые не являются квадратными: public Double [] [] ulpityRectmatrix (Double [] a, double [] b, int arow, int acol, int browser, int bcol) {если (arow! double [] [] {{0}}; Double [] [] c = новый двойной [arow] [bcol]; if (arow <acol) {double [] [] newa = new Double [acol] [acol]; double [] [] newb = new Double [Brow] [Brow]; int n = acol; for (int r = 0; r <acol; r ++) для (int c = 0; c <acol; c ++) newa [r] [c] = 0,0; for (int r = 0; r <браузер; r ++) для (int c = 0; c <браузер; c ++) newb [r] [c] = 0,0; for (int r = 0; r <браузер; r ++) для (int c = 0; c <bcol; c ++) newb [r] [c] = b [r] [c]; Double [] [] C2 = MultiplySquareMatrix (Newa, NewB, N); for (int r = 0; r <arow; r ++) для (int c = 0; c <bcol; c ++) c [r] [c] = c2 [r] [c]; } // end if else if (arow == acol) c = умноженная ssquarematrix (a, b, подход); else {int n = arow; Double [] [] newa = new Double [arow] [arow]; double [] [] newb = new Double [bcol] [bcol]; for (int r = 0; r <arow; r ++) для (int c = 0; c <arow; c ++) newa [r] [c] = 0,0; for (int r = 0; r <bcol; r ++) для (int c = 0; c <bcol; c ++) newb [r] [c] = 0,0; for (int r = 0; r <arow; r ++) для (int c = 0; c <acol; c ++) newa [r] [c] = a [r] [c]; for (int r = 0; r <бровь; r ++) для (int c = 0; c <bcol; c ++) newb [r] [c] = b [r] [c]; Double [] [] C2 = MultiplySquareMatrix (Newa, NewB, N); for (int r = 0; r <arow; r ++) для (int c = 0; c <bcol; c ++) c [r] [c] = c2 [r] [c]; } // end else return c; } // End Method // Работайте с матрицами, которые являются квадратными матрицами. public Double [] [] MultiplySquareMatrix (Double [] [] A2, Double [] [] b2, int n) {double [] [] c2 = new Double [n] [n]; for (int r = 0; r <n; r ++) для (int c = 0; c <n; c ++) c2 [r] [c] = 0; if (n == 1) {c2 [0] [0] = a2 [0] [0] * b2 [0] [0]; вернуть C2; } // end, если int exp2k = 2; while (exp2k <= (n / 2)) {exp2k *= 2; } // end loop if (exp2k == n) {c2 = strassenmultiply.strassenmultiplymatrix (a2, b2, n); вернуть C2; } // end else // Матрица Strassen: double [] [] [] a = new Double [6] [exp2k] [exp2k]; Double [] [] [] b = новый двойной [6] [exp2k] [exp2k]; double [] [] [] c = новый двойной [6] [exp2k] [exp2k]; for (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]; } // End Inner Lo for (int r = 0; r <exp2k; r ++) для (int c = 0; c <exp2k; c ++) c2 [r] [c] = c [0] [r] [c]; int middle = exp2k / 2; for (int r = 0; r <midne; 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 Inner Lo B [1] [r - exp2k] [c] = b2 [r] [c]; } // End Inner Lo B [4] [R - Middle] [C - exp2k] = b2 [r] [c]; } // end Внутренний цикл} // end outter outter for (int r = exp2k; r <n; r ++) {for (int c = midne; 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 Outter Lo / * Рассчитайте окончательные результаты сетки в квадрате «Самой 2^k, в соответствии с правилами умножения матрицы. */ For (int row = 0; row <exp2k; row ++) {для (int col = 0; col <exp2k; col ++) {для (int k = exp2k; k <n; k ++) {c2) [row] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k] [k]; } // end Loop} // End Inner Lo B2 [K] [row]; } // end Outter Loop return C2; Strassenmethod.java
пакетный матриксльгоритм; импортировать java.util.scanner; открытый класс strassenmethod {private Double [] [] [] [] a = new Double [2] [2] [] []; private Double [] [] [] [] b = новый двойной [2] [2] []; private Double [] [] [] [] c = новый двойной [2] [2] []; /*// Коды для тестирования этого класса: public static void main (string [] args) {scanner input = new Scanner (System.in); System.out.println («Размер ввода матрицы:»); int n = input.nextint (); Double [] [] a = new Double [n] [n]; Double [] [] B = новый Double [n] [n]; Double [] [] c = новый двойной [n] [n]; System.out.println («Входные данные для матрицы A:»); for (int r = 0; r <n; r ++) {for (int c = 0; c <n; c ++) {System.out.printf («Данные a [%d] [%d]:", r, c); A [r] [c] = input.nextdouble (); } // End Inner Lo for (int r = 0; r <n; r ++) {for (int c = 0; c <n; c ++) {System.out.printf («Данные a [%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 («Результат от матрицы C:»); for (int r = 0; r <n; r ++) {for (int c = 0; c <n; c ++) {System.out.printf ("Данные C [%d] [%d]:%f/n", r, c, c [r] [c]); } // end внутренний цикл} // end outter kine} // end main*/public double [] [] strassenmultiplymatrix (double [] [] a2, double b2 [] [], int n) {double [] [] c2 = new double [n] [n]; // Инициализировать матрицу: for (int rowindex = 0; rowindex <n; Rowindex ++) для (int colindex = 0; colindex <n; colindex ++) C2 [rowindex] [colindex] = 0,0; if (n == 1) c2 [0] [0] = a2 [0] [0] * b2 [0] [0]; // «Матриц срезов на 2 * 2 Части: else {double [] [] [] [] a = new Double [2] [2] [n / 2] [n / 2]; Double [] [] [] [] [] b = новый двойной [2] [2] [N / 2] [N / 2]; Double [] [] [] [] [] [] C = новый [2] [N / 2; r <n / 2; A [1] [1] [R] [C] = A2 [N / 2 + R] [N / 2 + C]; B [1] [1] [R] [C] = B2 [N/2 + R] [N/2 + C]; AddMatrix (A [0] [0], A [0] [1], N); AddMatrix (B [0] [0], B [1] [1], N); AddMatrix (B [0] [0], B [0] [1], N); Strassenmultiplymatrix (S [2], B [0] [0], N); P [6] = Strassenmultiplymatrix (S [8], S [9], N); AddMatrix (P [2], P [3], N); C2 [R] [C] = C [0] [0] [0] [R] [C]; /2 + C] = C [1] [1] [R] [C]; = 0; Double [n] [n];Я надеюсь, что эта статья будет полезна всем, чтобы изучить Java -программирование.