Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. import java.util.Arrays;
  2.  
  3. public class MatrixMultiplicationStrassen {
  4.  
  5. public static void main(String[] args) {
  6. /*int[][] A = new int[][]{{1, 3}, {7, 5}};
  7. int[][] B = new int[][]{{6, 8}, {4, 2}};*/
  8. int[][] A = new int[][]{{13, -3, -25, 20}, {-3, -16, -23, 18}, {20, -7, 12, -5}, {-22, 15, -4, 7}};
  9. int[][] B = new int[][]{{13, 10, 11, 12}, {13, 14, -23, 18}, {20, -7, 12, -11}, {-12, -13, -14, 7}};
  10. System.out.println(Arrays.deepToString(
  11. strassenMultiply(A, B, 0, 0, 0, 0, A.length)
  12. ));
  13.  
  14. }
  15.  
  16. public static int[][] strassenMultiply(int[][] A, int[][] B, int rowA, int colA, int rowB, int colB, int size) {
  17. int[][] C = new int[size][size];
  18. if (size == 1) {
  19. C[0][0] = A[rowA][colA] * B[rowB][colB];
  20. } else {
  21. int newSize = size / 2;
  22. int[][] S1 = sub(B, B, rowB, colB + newSize, rowB + newSize, colB + newSize, newSize);
  23. int[][] S2 = add(A, A, rowA, colA, rowA, colA + newSize, newSize);
  24. int[][] S3 = add(A, A, rowA + newSize, colA, rowA + newSize, colA + newSize, newSize);
  25. int[][] S4 = sub(B, B, rowB + newSize, colB, rowB, colB, newSize);
  26. int[][] S5 = add(A, A, rowA, colA, rowA + newSize, colA + newSize, newSize);
  27. int[][] S6 = add(B, B, rowB, colB, rowB + newSize, colB + newSize, newSize);
  28. int[][] S7 = sub(A, A, rowA, colA + newSize, rowA + newSize, colA + newSize, newSize);
  29. int[][] S8 = add(B, B, rowB + newSize, colB, rowB + newSize, colB + newSize, newSize);
  30. int[][] S9 = sub(A, A, rowA, colA, rowA + newSize, colA, newSize);
  31. int[][] S10 = add(B, B, rowB, colB, rowB, colB + newSize, newSize);
  32.  
  33. int[][] P1 = strassenMultiply(A, S1, rowA, colA, 0, 0, newSize);
  34. int[][] P2 = strassenMultiply(S2, B, 0, 0, rowB + newSize, colB + newSize, newSize);
  35. int[][] P3 = strassenMultiply(S3, B, 0, 0, rowB, colB, newSize);
  36. int[][] P4 = strassenMultiply(A, S4, rowA + newSize, colA + newSize, 0, 0, newSize);
  37. int[][] P5 = strassenMultiply(S5, S6, 0, 0, 0, 0, newSize);
  38. int[][] P6 = strassenMultiply(S7, S8, 0, 0, 0, 0, newSize);
  39. int[][] P7 = strassenMultiply(S9, S10, 0, 0, 0, 0, newSize);
  40.  
  41. int[][] C1 = add(sub(add(P5, P4), P2), P6);
  42. int[][] C2 = add(P1, P2);
  43. int[][] C3 = add(P3, P4);
  44. int[][] C4 = sub(sub(add(P5, P1), P3), P7);
  45.  
  46. join(C1, C, 0, 0);
  47. join(C2, C, 0, newSize);
  48. join(C3, C, newSize, 0);
  49. join(C4, C, newSize, newSize);
  50. }
  51. return C;
  52. }
  53.  
  54. private static void join(int[][] C1, int[][] C, int row, int col) {
  55. int size = C1.length;
  56. for (int i = 0; i < size; i++) {
  57. for (int j = 0; j < size; j++) {
  58. C[i + row][j + col] = C1[i][j];
  59. }
  60. }
  61. }
  62.  
  63.  
  64. private static int[][] add(int[][] A, int[][] B) {
  65. int[][] C = new int[A.length][B.length];
  66. for (int i = 0; i < A.length; i++) {
  67. for (int j = 0; j < B.length; j++) {
  68. C[i][j] = A[i][j] + B[i][j];
  69. }
  70. }
  71. return C;
  72. }
  73.  
  74. private static int[][] add(int[][] A, int[][] B, int rowA, int colA, int rowB, int colB, int size) {
  75. int[][] C = new int[size][size];
  76. for (int i = 0; i < size; i++) {
  77. for (int j = 0; j < size; j++) {
  78. C[i][j] = A[rowA + i][colA + j] + B[rowB + i][colB + j];
  79. }
  80. }
  81. return C;
  82. }
  83.  
  84. private static int[][] sub(int[][] A, int[][] B) {
  85. int[][] C = new int[A.length][B.length];
  86. for (int i = 0; i < A.length; i++) {
  87. for (int j = 0; j < B.length; j++) {
  88. C[i][j] = A[i][j] - B[i][j];
  89. }
  90. }
  91. return C;
  92. }
  93.  
  94. private static int[][] sub(int[][] A, int[][] B, int rowA, int colA, int rowB, int colB, int size) {
  95. int[][] C = new int[size][size];
  96. for (int i = 0; i < size; i++) {
  97. for (int j = 0; j < size; j++) {
  98. C[i][j] = A[rowA + i][colA + j] - B[rowB + i][colB + j];
  99. }
  100. }
  101. return C;
  102. }
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement