Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2014
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.77 KB | None | 0 0
  1. int ADD(int** MatrixA, int** MatrixB, int** MatrixResult, int MatrixSize )
  2. {
  3. for ( int i = 0; i < MatrixSize; i++)
  4. {
  5. for ( int j = 0; j < MatrixSize; j++)
  6. {
  7. MatrixResult[i][j] = MatrixA[i][j] + MatrixB[i][j];
  8. }
  9. }
  10. return 0;
  11. }
  12.  
  13. int SUB(int** MatrixA, int** MatrixB, int** MatrixResult, int MatrixSize )
  14. {
  15. for ( int i = 0; i < MatrixSize; i++)
  16. {
  17. for ( int j = 0; j < MatrixSize; j++)
  18. {
  19. MatrixResult[i][j] = MatrixA[i][j] - MatrixB[i][j];
  20. }
  21. }
  22. return 0;
  23. }
  24.  
  25. int MUL( int** MatrixA, int** MatrixB, int** MatrixResult, int MatrixSize )
  26. {
  27. for (int i=0;i<MatrixSize ;i++)
  28. {
  29. for (int j=0;j<MatrixSize ;j++)
  30. {
  31. MatrixResult[i][j]=0;
  32. for (int k=0;k<MatrixSize ;k++)
  33. {
  34. MatrixResult[i][j]=MatrixResult[i][j]+MatrixA[i][k]*MatrixB[k][j];
  35. }
  36. }
  37. }
  38. return 0;
  39. }
  40. int Strassen(int N, int **MatrixA, int **MatrixB, int **MatrixC)
  41. {
  42.  
  43. int HalfSize = N/2;
  44. int newSize = N/2;
  45.  
  46. if ( N <= 32 )//choosing the threshold is extremely important, try N<=2 to see the result
  47. {
  48. MUL(MatrixA,MatrixB,MatrixC,N);
  49. }
  50. else
  51. {
  52. int** A11;
  53. int** A12;
  54. int** A21;
  55. int** A22;
  56.  
  57. int** B11;
  58. int** B12;
  59. int** B21;
  60. int** B22;
  61.  
  62. int** C11;
  63. int** C12;
  64. int** C21;
  65. int** C22;
  66.  
  67. int** M1;
  68. int** M2;
  69. int** M3;
  70. int** M4;
  71. int** M5;
  72. int** M6;
  73. int** M7;
  74. int** AResult;
  75. int** BResult;
  76.  
  77. //making a 1 diminsional pointer based array.
  78. A11 = new int *[newSize];
  79. A12 = new int *[newSize];
  80. A21 = new int *[newSize];
  81. A22 = new int *[newSize];
  82.  
  83. B11 = new int *[newSize];
  84. B12 = new int *[newSize];
  85. B21 = new int *[newSize];
  86. B22 = new int *[newSize];
  87.  
  88. C11 = new int *[newSize];
  89. C12 = new int *[newSize];
  90. C21 = new int *[newSize];
  91. C22 = new int *[newSize];
  92.  
  93. M1 = new int *[newSize];
  94. M2 = new int *[newSize];
  95. M3 = new int *[newSize];
  96. M4 = new int *[newSize];
  97. M5 = new int *[newSize];
  98. M6 = new int *[newSize];
  99. M7 = new int *[newSize];
  100.  
  101. AResult = new int *[newSize];
  102. BResult = new int *[newSize];
  103.  
  104. int newLength = newSize;
  105.  
  106. //making that 1 diminsional pointer based array , a 2D pointer based array
  107. for ( int i = 0; i < newSize; i++)
  108. {
  109. A11[i] = new int[newLength];
  110. A12[i] = new int[newLength];
  111. A21[i] = new int[newLength];
  112. A22[i] = new int[newLength];
  113.  
  114. B11[i] = new int[newLength];
  115. B12[i] = new int[newLength];
  116. B21[i] = new int[newLength];
  117. B22[i] = new int[newLength];
  118.  
  119. C11[i] = new int[newLength];
  120. C12[i] = new int[newLength];
  121. C21[i] = new int[newLength];
  122. C22[i] = new int[newLength];
  123.  
  124. M1[i] = new int[newLength];
  125. M2[i] = new int[newLength];
  126. M3[i] = new int[newLength];
  127. M4[i] = new int[newLength];
  128. M5[i] = new int[newLength];
  129. M6[i] = new int[newLength];
  130. M7[i] = new int[newLength];
  131.  
  132. AResult[i] = new int[newLength];
  133. BResult[i] = new int[newLength];
  134.  
  135.  
  136. }
  137. //splitting input Matrixes, into 4 submatrices each.
  138. for (int i = 0; i < N / 2; i++)
  139. {
  140. for (int j = 0; j < N / 2; j++)
  141. {
  142. A11[i][j] = MatrixA[i][j];
  143. A12[i][j] = MatrixA[i][j + N / 2];
  144. A21[i][j] = MatrixA[i + N / 2][j];
  145. A22[i][j] = MatrixA[i + N / 2][j + N / 2];
  146.  
  147. B11[i][j] = MatrixB[i][j];
  148. B12[i][j] = MatrixB[i][j + N / 2];
  149. B21[i][j] = MatrixB[i + N / 2][j];
  150. B22[i][j] = MatrixB[i + N / 2][j + N / 2];
  151.  
  152. }
  153. }
  154.  
  155. //here we calculate M1..M7 matrices .
  156. //M1[][]
  157. ADD( A11,A22,AResult, HalfSize);
  158. ADD( B11,B22,BResult, HalfSize);
  159. Strassen( HalfSize, AResult, BResult, M1 ); //now that we need to multiply this , we use the strassen itself .
  160.  
  161.  
  162. //M2[][]
  163. ADD( A21,A22,AResult, HalfSize); //M2=(A21+A22)B11
  164. Strassen(HalfSize, AResult, B11, M2); //Mul(AResult,B11,M2);
  165.  
  166. //M3[][]
  167. SUB( B12,B22,BResult, HalfSize); //M3=A11(B12-B22)
  168. Strassen(HalfSize, A11, BResult, M3); //Mul(A11,BResult,M3);
  169.  
  170. //M4[][]
  171. SUB( B21, B11, BResult, HalfSize); //M4=A22(B21-B11)
  172. Strassen(HalfSize, A22, BResult, M4); //Mul(A22,BResult,M4);
  173.  
  174. //M5[][]
  175. ADD( A11, A12, AResult, HalfSize); //M5=(A11+A12)B22
  176. Strassen(HalfSize, AResult, B22, M5); //Mul(AResult,B22,M5);
  177.  
  178.  
  179. //M6[][]
  180. SUB( A21, A11, AResult, HalfSize);
  181. ADD( B11, B12, BResult, HalfSize); //M6=(A21-A11)(B11+B12)
  182. Strassen( HalfSize, AResult, BResult, M6); //Mul(AResult,BResult,M6);
  183.  
  184. //M7[][]
  185. SUB(A12, A22, AResult, HalfSize);
  186. ADD(B21, B22, BResult, HalfSize); //M7=(A12-A22)(B21+B22)
  187. Strassen(HalfSize, AResult, BResult, M7); //Mul(AResult,BResult,M7);
  188.  
  189. //C11 = M1 + M4 - M5 + M7;
  190. ADD( M1, M4, AResult, HalfSize);
  191. SUB( M7, M5, BResult, HalfSize);
  192. ADD( AResult, BResult, C11, HalfSize);
  193.  
  194. //C12 = M3 + M5;
  195. ADD( M3, M5, C12, HalfSize);
  196.  
  197. //C21 = M2 + M4;
  198. ADD( M2, M4, C21, HalfSize);
  199.  
  200. //C22 = M1 + M3 - M2 + M6;
  201. ADD( M1, M3, AResult, HalfSize);
  202. SUB( M6, M2, BResult, HalfSize);
  203. ADD( AResult, BResult, C22, HalfSize);
  204.  
  205.  
  206. //at this point , we have calculated the c11..c22 matrices, and now we are going to
  207. //put them together and make a unit matrix which would describe our resulting Matrix.
  208. for (int i = 0; i < N/2 ; i++)
  209. {
  210. for (int j = 0 ; j < N/2 ; j++)
  211. {
  212. MatrixC[i][j] = C11[i][j];
  213. MatrixC[i][j + N / 2] = C12[i][j];
  214. MatrixC[i + N / 2][j] = C21[i][j];
  215. MatrixC[i + N / 2][j + N / 2] = C22[i][j];
  216. }
  217. }
  218.  
  219. // dont forget to free the space we alocated for matrices,
  220. for (int i = 0; i < newLength; i++)
  221. {
  222. delete[] A11[i];delete[] A12[i];delete[] A21[i];
  223. delete[] A22[i];
  224.  
  225. delete[] B11[i];delete[] B12[i];delete[] B21[i];
  226. delete[] B22[i];
  227. delete[] C11[i];delete[] C12[i];delete[] C21[i];
  228. delete[] C22[i];
  229. delete[] M1[i];delete[] M2[i];delete[] M3[i];delete[] M4[i];
  230. delete[] M5[i];delete[] M6[i];delete[] M7[i];
  231. delete[] AResult[i];delete[] BResult[i] ;
  232. }
  233. delete[] A11;delete[] A12;delete[] A21;delete[] A22;
  234. delete[] B11;delete[] B12;delete[] B21;delete[] B22;
  235. delete[] C11;delete[] C12;delete[] C21;delete[] C22;
  236. delete[] M1;delete[] M2;delete[] M3;delete[] M4;delete[] M5;
  237. delete[] M6;delete[] M7;
  238. delete[] AResult;
  239. delete[] BResult ;
  240.  
  241.  
  242. }//end of else
  243.  
  244.  
  245. return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement