Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.90 KB | None | 0 0
  1. //
  2. // main.cpp
  3. // Matrices
  4. //
  5. // Created by Apple on 18.04.2018.
  6. // Copyright © 2018 Egor. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include <cmath>
  11. #include <random>
  12. #include <ctime>
  13. #include <chrono>
  14. #include <iomanip>
  15. #include <vector>
  16.  
  17.  
  18. using namespace std;
  19. typedef std::vector<std::vector<int>> Matrix;
  20.  
  21.  
  22.  
  23.  
  24. int log2(int x)
  25. {
  26. int result = 1;
  27. while ((x >>= 1) != 0) result++;
  28. return 1 << result;
  29. }
  30.  
  31.  
  32. Matrix initMatrix(int size)
  33. {
  34. Matrix matrix = vector<vector<int>>(size);
  35. for (auto &el:matrix)
  36. el= vector<int>(size);
  37. return matrix;
  38. }
  39.  
  40. void fillMatrix(Matrix &matrix,int size)
  41. {
  42.  
  43. for (int i = 0; i < size; i++)
  44. {
  45. for(int j = 0; j < size; j++)
  46. {
  47. matrix[i][j] = rand()%100-50;
  48. }
  49. }
  50. cout << "\n";
  51. }
  52.  
  53.  
  54. void showMatrix(Matrix &matrix, int size)
  55. {
  56. for (int i = 0 ; i < size;i++)
  57. {
  58. cout << "|";
  59. for (int j = 0; j < size; j++)
  60. {
  61. cout << setw(6) <<matrix[i][j];
  62. }
  63. cout << "|\n";
  64. }
  65. }
  66.  
  67.  
  68. Matrix multiplyMatrices(Matrix &leftMatrix,Matrix &rightMatrix, int size)
  69. {
  70. Matrix resultMatrix = initMatrix(size);
  71.  
  72. int buf;
  73. for (int i = 0 ; i < size; i++)
  74. {
  75. buf = 0;
  76. for(int j = 0; j < size; j++)
  77. {
  78. for (int l = 0; l < size; l++)
  79. {
  80. buf += leftMatrix[i][l] * rightMatrix[l][j];
  81. }
  82. resultMatrix[i][j] = buf;
  83. }
  84.  
  85. }
  86.  
  87. return resultMatrix;
  88. }
  89.  
  90.  
  91. Matrix sumMatrix(Matrix left, Matrix right)
  92. {
  93. int size = left.size();
  94. Matrix c = initMatrix(size);
  95.  
  96. for (int i = 0 ; i < size; ++i)
  97. {
  98. for (int j = 0; j < size; ++j)
  99. {
  100. c[i][j] = left[i][j] + right[i][j];
  101. }
  102. }
  103. return c;
  104. }
  105.  
  106.  
  107. Matrix subtractMatrix(Matrix left, Matrix right)
  108. {
  109. int size = left.size();
  110. Matrix c = initMatrix(size);
  111.  
  112. for (int i = 0 ; i < size; ++i)
  113. {
  114. for (int j = 0; j < size; ++j)
  115. {
  116. c[i][j] = left[i][j] - right[i][j];
  117. }
  118. }
  119. return c;
  120. }
  121.  
  122. void splitMatrix(Matrix &A,Matrix &A11,Matrix &A12,Matrix &A21,Matrix &A22)
  123. {
  124. int newSize = A.size()>>1;
  125. A11 = initMatrix(newSize);
  126. A12 = initMatrix(newSize);
  127. A21 = initMatrix(newSize);
  128. A22 = initMatrix(newSize);
  129.  
  130. for (int i = 0 ; i < newSize; ++i)
  131. {
  132. for (int j = 0; j < newSize; ++j)
  133. {
  134. if (i >= newSize)
  135. {
  136. if (j>= newSize)
  137. {
  138. A22[i-newSize][j-newSize] = A[i][j];
  139. }
  140. else
  141. {
  142. A21[i-newSize][j] = A[i][j];
  143.  
  144. }
  145. }
  146. else
  147. {
  148. if (j>= newSize)
  149. {
  150. A12[i][j-newSize] = A[i][j];
  151.  
  152. }
  153. else
  154. {
  155. A11[i][j] = A[i][j];
  156.  
  157. }
  158. }
  159. }
  160. }
  161. }
  162.  
  163.  
  164. Matrix collectMatrix(Matrix A11,Matrix A12,Matrix A21,Matrix A22)
  165. {
  166. int newSize = A11.size();
  167. Matrix A = initMatrix( newSize << 1);
  168.  
  169. for (int i = 0 ; i < newSize; ++i)
  170. {
  171. for (int j = 0; j < newSize; ++j)
  172. {
  173. if (i >= newSize)
  174. {
  175. if (j>= newSize)
  176. {
  177. A[i][j] = A22[i-newSize][j-newSize];
  178. }
  179. else
  180. {
  181. A[i][j] = A21[i-newSize][j];
  182.  
  183. }
  184. }
  185. else
  186. {
  187. if (j>= newSize)
  188. {
  189. A[i][j] = A12[i][j-newSize];
  190.  
  191. }
  192. else
  193. {
  194. A[i][j] = A11[i][j];
  195. }
  196. }
  197. }
  198. }
  199. return A;
  200. }
  201.  
  202.  
  203. Matrix multiStrassen(Matrix a, Matrix b, int size) {
  204. if (size <= 64) {
  205. return multiplyMatrices(a, b,size);
  206. }
  207.  
  208. size = size >> 1;
  209.  
  210. Matrix a11 = initMatrix(size);
  211. Matrix a12 = initMatrix(size);
  212. Matrix a21 = initMatrix(size);
  213. Matrix a22 = initMatrix(size);
  214.  
  215. Matrix b11 = initMatrix(size);
  216. Matrix b12 = initMatrix(size);
  217. Matrix b21 = initMatrix(size);
  218. Matrix b22 = initMatrix(size);
  219.  
  220. splitMatrix(a, a11, a12, a21, a22);
  221. splitMatrix(b, b11, b12, b21, b22);
  222.  
  223. Matrix p1 = initMatrix(size);
  224. p1 = multiStrassen(sumMatrix(a11, a22), sumMatrix(b11, b22), size);
  225. Matrix p2 = initMatrix(size);
  226. p2 = multiStrassen(sumMatrix(a21, a22), b11, size);
  227. Matrix p3 = initMatrix(size);
  228. p3 = multiStrassen(a11, subtractMatrix(b12, b22), size);
  229. Matrix p4 = initMatrix(size);
  230. p4 = multiStrassen(a22, subtractMatrix(b21, b11), size);
  231. Matrix p5 = initMatrix(size);
  232. p5 = multiStrassen(sumMatrix(a11, a12), b22, size);
  233. Matrix p6 = initMatrix(size);
  234. p6 = multiStrassen(subtractMatrix(a21, a11), sumMatrix(b11, b12), size);
  235. Matrix p7 = initMatrix(size);
  236. p7 = multiStrassen(subtractMatrix(a12, a22), sumMatrix(b21, b22), size);
  237.  
  238. Matrix c11 = initMatrix(size);
  239. c11 = sumMatrix(sumMatrix(p1, p4), subtractMatrix(p7, p5));
  240. Matrix c12 = initMatrix(size);
  241. c12 = sumMatrix(p3, p5);
  242. Matrix c21 = initMatrix(size);
  243. c21 = sumMatrix(p2, p4);
  244. Matrix c22 = initMatrix(size);
  245. c22 = sumMatrix(subtractMatrix(p1, p2), sumMatrix(p3, p6));
  246. return collectMatrix(c11, c12, c21, c22);
  247. }
  248.  
  249. int main(int argc, const char * argv[])
  250. {
  251. srand(time(nullptr));
  252.  
  253. setlocale(LC_ALL, "russian");
  254.  
  255.  
  256.  
  257. cout << "Введите размер матриц\n";
  258. Matrix matrixA;
  259. int size;
  260. cin >> size;
  261. matrixA = initMatrix(size);
  262. fillMatrix(matrixA, size);
  263. // showMatrix(matrixA, size);
  264. cout <<"\n";
  265. Matrix matrixB;
  266. matrixB = initMatrix(size);
  267. fillMatrix(matrixB, size);
  268. // showMatrix(matrixB, size);
  269. cout <<"\n";
  270. Matrix resMat1,resMat2;
  271. {
  272.  
  273. auto start = std::chrono::high_resolution_clock::now();
  274.  
  275. resMat2 = multiStrassen(matrixA, matrixB, size);
  276. auto finish = std::chrono::high_resolution_clock::now();
  277. auto time = std::chrono::duration_cast<std::chrono::milliseconds>(finish-start);
  278. cout << static_cast<float>(time.count()/1000.0f) <<"s" << endl;
  279. }
  280. // showMatrix(resMat, size);
  281.  
  282. {
  283.  
  284. auto start = std::chrono::high_resolution_clock::now();
  285.  
  286. resMat1 = multiplyMatrices(matrixA, matrixB, size);
  287. auto finish = std::chrono::high_resolution_clock::now();
  288. auto time = std::chrono::duration_cast<std::chrono::milliseconds>(finish-start);
  289. cout << static_cast<float>(time.count()/1000.0f) <<"s" << endl;
  290. }
  291.  
  292.  
  293. return 0;
  294. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement