CS 3343/3341 Introduction to Algorithms |
Ordinary Matrix Multiplication Using Divide and Conquer |
4-by-4 Matrices | 2-by-2 of 2-by-2 Matrices |
---|---|
// Matr.java: multiply matrices, with returns public class Matr { // C = A*B, mult of 4-by-4 matrices int[][] mult(int A[][], int B[][]){ int[][] C = new int[4][4]; for (int i = 0; i < 4; i++) { //rows for (int j = 0; j < 4; j++) { //cols C[i][j] = 0; for (int k = 0; k < 4; k++) C[i][j] += A[i][k] * B[k][j]; } } return C; } void printMat(int A[][]){ for (int i = 0; i < 4; i++){ System.out.print("|"); for (int j = 0; j < 4; j++) System.out.print(" "+A[i][j]+" "); System.out.print("|\n"); } System.out.print("\n"); } public static void main(String[] argv) { Matr matr = new Matr(); int [][] A = {{2, 3, 1, 6}, {4, 0, 0, 2}, {4, 2, 0, 1}, {0, 3, 5, 2}}; int [][] B = {{3, 0, 4, 3}, {1, 2, 0, 2}, {0, 3, 1, 4}, {5, 1, 3, 2}}; int [][] C = matr.mult(A, B); matr.printMat(A); matr.printMat(B); matr.printMat(C); } } | // Matr2.java: multiply matrices, with returns public class Matr2 { // C = A*B, mult of 2-by-2 matrices int[][] mult(int A[][], int B[][]){ int[][] C = new int[2][2]; for (int i = 0; i < 2; i++) { //rows for (int j = 0; j < 2; j++) { //cols C[i][j] = 0; for (int k = 0; k < 2; k++) C[i][j] += A[i][k] * B[k][j]; } } return C; } // C = A + B, addition of 2-by-2 matrices int[][] add(int A[][], int B[][]){ int[][] C = new int[2][2]; for (int i = 0; i < 2; i++) { //rows for (int j = 0; j < 2; j++) { //cols C[i][j] = A[i][j] + B[i][j]; } } return C; } void printMat(int A[][]){ for (int i = 0; i < 2; i++){ System.out.print("|"); for (int j = 0; j < 2; j++) System.out.print(" "+A[i][j]+" "); System.out.print("|\n"); } System.out.print("\n"); } public static void main(String[] argv) { Matr2 matr = new Matr2(); int [][] A11 = {{2, 3}, {4, 0}}; int [][] A12 = {{1, 6}, {0, 2}}; int [][] A21 = {{4, 2}, {0, 3}}; int [][] A22 = {{0, 1}, {5, 2}}; int [][] B11 = {{3, 0}, {1, 2}}; int [][] B12 = {{4, 3}, {0, 2}}; int [][] B21 = {{0, 3}, {5, 1}}; int [][] B22 = {{1, 4}, {3, 2}}; int [][] C11 = matr.add(matr.mult(A11, B11), matr.mult(A12, B21)); matr.printMat(A11); matr.printMat(B11); matr.printMat(A12); matr.printMat(B21); matr.printMat(C11); System.out.println("-----------"); int [][] C12 = matr.add(matr.mult(A11, B12), matr.mult(A12, B22)); matr.printMat(A11); matr.printMat(B12); matr.printMat(A12); matr.printMat(B22); matr.printMat(C12); System.out.println("-----------"); int [][] C21 = matr.add(matr.mult(A21, B11), matr.mult(A22, B21)); matr.printMat(A21); matr.printMat(B11); matr.printMat(A22); matr.printMat(B21); matr.printMat(C21); System.out.println("-----------"); int [][] C22 = matr.add(matr.mult(A21, B12), matr.mult(A22, B22)); matr.printMat(A21); matr.printMat(B12); matr.printMat(A22); matr.printMat(B22); matr.printMat(C22); System.out.println("-----------"); } } |
| 2 3 1 6 | | 4 0 0 2 | | A11 A12 | | 4 2 0 1 | = A = | A21 A22 | | 0 3 5 2 | | 3 0 4 3 | | 1 2 0 2 | | B11 B12 | | 0 3 1 4 | = B = | B21 B22 | | 5 1 3 2 | | 39 15 27 28 | | 22 2 22 16 | | C11 C12 | | 19 5 19 18 | = A * B = | C21 C22 | | 13 23 11 30 | |