Guest User

Untitled

a guest
Mar 19th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.47 KB | None | 0 0
  1. //Strassen's algorithm for square matrix multiplication-page 79 of introduction
  2. //to algorithms
  3.  
  4. //NOTE: ONLY WORKS FOR SQUARE MATRICES FOR WHICH THEIR SIZE IS A POWER OF 2.
  5.  
  6. #include <iostream>
  7.  
  8. using namespace std;
  9.  
  10. //function prototypes
  11. int ** matrix_addition(int ** A, int ** B, int rowA, int colA, int rowB, int colB, int size);
  12. int ** matrix_subtraction(int ** A, int ** B, int rowA, int colA, int rowB, int colB, int size);
  13. int ** matirx_multiply(int ** A, int ** B, int rowA, int colA, int rowB, int colB, int size);
  14.  
  15. int main(void)
  16. {
  17. cout << "enter size of matrices. the size should be a power of 2. if not, unpredictable result." << endl;
  18. int size = 0;
  19. cin >> size;
  20.  
  21. int ** matrix1 = new int *[size];
  22. *matrix1 = new int[size * size];
  23.  
  24. int ** matrix2 = new int *[size];
  25. *matrix2 = new int[size * size];
  26.  
  27. for (int i = 0; i < size; ++i){
  28. matrix1[i] = matrix1[0] + i * size;
  29. matrix2[i] = matrix2[0] + i * size;
  30. }
  31.  
  32.  
  33. cout << "enter matrix A elements" << endl;
  34. for (int i = 0; i < size; ++i)
  35. for (int j = 0; j < size; ++j)
  36. cin >> matrix1[i][j];
  37.  
  38.  
  39. cout << "enter matrix B elements" << endl;
  40. for (int i = 0; i < size; ++i)
  41. for (int j = 0; j < size; ++j)
  42. cin >> matrix2[i][j];
  43.  
  44. int ** tmp = matirx_multiply(matrix1, matrix2, 0, 0, 0, 0, size);
  45.  
  46. cout << endl << "the result of matrix multiplication is:" << endl;
  47. for (int i = 0; i < size; ++i) {
  48. for (int j = 0; j < size; ++j)
  49. cout << tmp[i][j] << ' ';
  50.  
  51. cout << endl;
  52. }
  53.  
  54. cout << endl;
  55.  
  56. return 0;
  57. }
  58.  
  59. int ** matirx_multiply(int ** A, int ** B, int rowA, int colA, int rowB, int colB, int size)
  60. {
  61. if (size == 1){
  62. int ** result = new int * [1];
  63. *result = new int[1];
  64.  
  65. result[0][0] = A[rowA][colA] * B[rowB][colB];
  66.  
  67. return result;
  68. }
  69.  
  70. int middle = size / 2;
  71.  
  72. int ** S1 = matrix_subtraction(B, B, rowB, colB + middle, rowB + middle, colB + middle, size / 2);
  73. int ** S2 = matrix_addition(A, A, rowA, colA, rowA, colA + middle, size / 2);
  74. int ** S3 = matrix_addition(A, A, rowA + middle, colA, rowA + middle, rowA + middle, size / 2);
  75. int ** S4 = matrix_subtraction(B, B, rowB + middle, colB, rowB, colB, size / 2);
  76. int ** S5 = matrix_addition(A, A, rowA, colA, rowA + middle, colA + middle, size / 2);
  77. int ** S6 = matrix_addition(B, B, rowB, colB, rowB + middle, colB + middle, size / 2);
  78. int ** S7 = matrix_subtraction(A, A, rowA, colA + middle, rowA + middle, colA + middle, size / 2);
  79. int ** S8 = matrix_addition(B, B, rowB + middle, colB, rowB + middle, colB + middle, size / 2);
  80. int ** S9 = matrix_subtraction(A, A, rowA, colA, rowA + middle, colA, size / 2);
  81. int ** S10 = matrix_addition(B, B, rowB, colB, rowB, colB + middle, size / 2);
  82.  
  83.  
  84. int ** P1 = matirx_multiply(A, S1, rowA, colA, 0, 0, size / 2);
  85. int ** P2 = matirx_multiply(S2, B, 0, 0, rowB + middle, colB + middle, size / 2);
  86. int ** P3 = matirx_multiply(S3, B, 0, 0, rowB, colB, size / 2);
  87. int ** P4 = matirx_multiply(A, S4, rowA + middle, rowA + middle, 0, 0, size / 2);
  88. int ** P5 = matirx_multiply(S5, S6, 0, 0, 0, 0, size / 2);
  89. int ** P6 = matirx_multiply(S7, S8, 0, 0, 0, 0, size / 2);
  90. int ** P7 = matirx_multiply(S9, S10, 0, 0, 0, 0, size / 2);
  91.  
  92. int ** sum1 = matrix_addition(P5, P4, 0, 0, 0, 0, size / 2);
  93. int ** sum2 = matrix_addition(sum1, P6, 0, 0, 0, 0, size / 2);
  94. int ** C11 = matrix_subtraction(sum2, P2, 0, 0, 0, 0, size / 2);
  95.  
  96. int ** C12 = matrix_addition(P1, P2, 0, 0, 0, 0, size / 2);
  97. int ** C21 = matrix_addition(P3, P4, 0, 0, 0, 0, size / 2);
  98.  
  99. int ** sum3 = matrix_addition(P5, P1, 0, 0, 0, 0, size / 2);
  100. int ** sum4 = matrix_addition(P3, P7, 0, 0, 0, 0, size / 2);
  101. int ** C22 = matrix_subtraction(sum3, sum4, 0, 0, 0, 0, size / 2);
  102.  
  103.  
  104. //creating result matrix
  105. int ** result = new int *[size];
  106. *result = new int[size * size];
  107.  
  108. for (int i = 0; i < size; ++i)
  109. result[i] = result[0] + i * size;
  110.  
  111. for (int i = 0; i < size / 2; ++i)
  112. for (int j = 0; j < size / 2; ++j)
  113. result[i][j] = C11[i][j];
  114.  
  115. for (int i = 0; i < size / 2; ++i)
  116. for (int j = size / 2; j < size; ++j)
  117. result[i][j] = C12[i][j - size / 2];
  118.  
  119.  
  120. for (int i = size / 2; i < size; ++i)
  121. for (int j = 0; j < size / 2; ++j)
  122. result[i][j] = C21[i - size / 2][j];
  123.  
  124. for (int i = size / 2; i < size; ++i)
  125. for (int j = size / 2; j < size; ++j)
  126. result[i][j] = C22[i - size / 2][j - size / 2];
  127.  
  128.  
  129. delete[] S1;
  130. delete[] S2;
  131. delete[] S3;
  132. delete[] S4;
  133. delete[] S5;
  134. delete[] S6;
  135. delete[] S7;
  136. delete[] S8;
  137. delete[] S9;
  138. delete[] S10;
  139.  
  140. S1 = S2 = S3 = S4 = S5 = S6 = S7 = S8 = S9 = S10 = nullptr;
  141.  
  142. delete[] P1;
  143. delete[] P2;
  144. delete[] P3;
  145. delete[] P4;
  146. delete[] P5;
  147. delete[] P6;
  148. delete[] P7;
  149.  
  150. P1 = P2 = P3 = P4 = P5 = P6 = P7 = nullptr;
  151.  
  152. delete[] sum1;
  153. delete[] sum2;
  154. delete[] sum3;
  155. delete[] sum4;
  156.  
  157. sum1 = sum2 = sum3 = sum4 = nullptr;
  158.  
  159. delete[] C11;
  160. delete[] C12;
  161. delete[] C21;
  162. delete[] C22;
  163.  
  164. C11 = C12 = C21 = C22 = nullptr;
  165.  
  166. return result;
  167. }
  168.  
  169. int ** matrix_addition(int ** A, int ** B, int rowA, int colA, int rowB, int colB, int size)
  170. {
  171. int ** result = new int *[size];
  172. *result = new int[size * size];
  173.  
  174. for (int i = 0; i < size; ++i)
  175. result[i] = result[0] + i * size;
  176.  
  177. for (int i = 0; i < size; ++i)
  178. for (int j = 0; j < size; ++j)
  179. result[i][j] = A[rowA + i][colA + j] + B[rowB + i][colB + j];
  180.  
  181. return result;
  182. }
  183.  
  184. int ** matrix_subtraction(int ** A, int ** B, int rowA, int colA, int rowB, int colB, int size)
  185. {
  186. int ** result = new int *[size];
  187. *result = new int[size * size];
  188.  
  189. for (int i = 0; i < size; ++i)
  190. result[i] = result[0] + i * size;
  191.  
  192. for (int i = 0; i < size; ++i)
  193. for (int j = 0; j < size; ++j)
  194. result[i][j] = A[rowA + i][colA + j] - B[rowB + i][colB + j];
  195.  
  196. return result;
  197. }
Add Comment
Please, Sign In to add comment