Facebook
From Putrid Terrapin, 5 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 216
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <iomanip>
  4. #include <ctime>
  5. #include <thread>
  6.  
  7. using namespace std;
  8.  
  9. int ** allocateMatrix(int size);
  10. int * allocateVector(int size);
  11.  
  12. void initializeMatrix(int **matrix, int size);
  13. void initializeVector(int *vector, int size);
  14.  
  15. void showMatrix(int **matrix, int size);
  16. void showVector(int *vector, int size);
  17.  
  18. void multiply(int **matrix, int *vector, int **helpMatrix, int size);
  19. void multiplyWithTreads(int **matrix, int *vector, int **helpMatrix, int size);
  20.  
  21. int * getResult(int **helpMatrix, int size);
  22.  
  23. void calculateRow(int number, int * matrixColumn, int **helpMatrix, int size, int row);
  24.  
  25. void dealocateMatrix(int **matrix, int size);
  26. void dealocateVector(int *vector, int size);
  27.  
  28. int main()
  29. {
  30.         srand(time(NULL));
  31.  
  32.         int size = 0;
  33.  
  34.         cout << "Podaj rozmiar macierzy" << endl;
  35.         cin >> size;
  36.         cout << '\n';
  37.  
  38.         char gate = 'N';
  39.  
  40.         cout << "Wypisac macierze? [T/N]: ";
  41.         cin >> gate;
  42.         cout << '\n';
  43.  
  44.         clock_t start;
  45.         double duration;
  46.        
  47.         start = clock();
  48.        
  49.         int **matrix = allocateMatrix(size);
  50.         int *vector = allocateVector(size);
  51.         int **helpMatrix = allocateMatrix(size);
  52.        
  53.         initializeMatrix(matrix, size);
  54.         initializeVector(vector, size);
  55.  
  56.         if (gate == 'T')
  57.         {
  58.                 cout << "Macierz:" << endl;
  59.                 showMatrix(matrix, size);
  60.                 cout << endl;
  61.                 cout << endl << "Vector:" << endl;
  62.                 showVector(vector, size);
  63.                 cout << endl;
  64.         }
  65.  
  66.         cout << endl << "Start..." << endl;
  67.         multiply(matrix, vector, helpMatrix, size);
  68.         int * result1 = getResult(helpMatrix, size);
  69.         if (gate == 'T')
  70.         {
  71.                 showVector(result1, size);
  72.         }      
  73.         cout << endl << "End..." << endl;
  74.  
  75.         duration = ( clock() - start ) / (double) CLOCKS_PER_SEC;
  76.     cout << endl << endl << "Czas: "<< duration << " [s]\n";
  77.         start = clock();
  78.  
  79.         cout << endl << "Start with threads..." << endl;
  80.         multiplyWithTreads(matrix, vector, helpMatrix, size);
  81.         int * result2 = getResult(helpMatrix, size);
  82.         if (gate == 'T')
  83.         {
  84.                 showVector(result2, size);
  85.         }
  86.         cout << endl << "End with threads..." << endl;
  87.  
  88.         duration = ( clock() - start ) / (double) CLOCKS_PER_SEC;
  89.     cout << endl << endl << "Czas: "<< duration << " [s]\n";
  90.  
  91.         dealocateMatrix(matrix, size);
  92.         dealocateMatrix(helpMatrix, size);
  93.         dealocateVector(vector, size);
  94.         dealocateVector(result1, size);
  95.         dealocateVector(result2, size);
  96.  
  97.         cin >> size;
  98.  
  99.         return 0;
  100. }
  101.  
  102. int ** allocateMatrix(int size)
  103. {
  104.         int ** matrix = new int *[size];
  105.  
  106.         for (int i = 0; i < size; i++)
  107.         {
  108.                 matrix[i] = new int[size];
  109.         }
  110.        
  111.         return matrix;
  112. }
  113.  
  114. int * allocateVector(int size)
  115. {
  116.         int * vector = new int [size];
  117.         return vector;
  118. }
  119.  
  120. void initializeMatrix(int **matrix, int size)
  121. {
  122.         for (int i = 0; i < size; i++)
  123.         {
  124.                 for (int j = 0; j < size; j++)
  125.                 {
  126.                         matrix[i][j] = rand() % 101;
  127.                 }
  128.         }
  129. }
  130.  
  131. void initializeVector(int *vector, int size)
  132. {
  133.         for (int i = 0; i < size; i++)
  134.         {
  135.                 vector[i] = rand() % 101;
  136.         }
  137. }
  138.  
  139. void showMatrix(int **matrix, int size)
  140. {
  141.         for (int i = 0; i < size; i++)
  142.         {
  143.                 for (int j = 0; j < size; j++)
  144.                 {
  145.                         cout << setw(6) << matrix[i][j];
  146.                 }
  147.                
  148.                 cout << '\n';
  149.         }
  150.        
  151.         cout << '\n';
  152. }
  153.  
  154. void showVector(int *vector, int size)
  155. {
  156.         for (int i = 0; i < size; i++)
  157.         {
  158.                 cout << setw(6) << vector[i];
  159.         }
  160. }
  161.  
  162. void calculateRow(int number, int * matrixColumn, int **helpMatrix, int size, int row)
  163. {
  164.         for (int i = 0; i < size; i++)
  165.         {
  166.                 helpMatrix[row][i] = number * matrixColumn[i];
  167.         }
  168. }
  169.  
  170. void multiply(int **matrix, int *vector, int **helpMatrix, int size)
  171. {
  172.         for (int i = 0; i < size; i++)
  173.         {
  174.                 calculateRow(vector[i], matrix[i], helpMatrix, size, i);
  175.         }
  176. }
  177.  
  178. void multiplyWithTreads(int **matrix, int *vector, int **helpMatrix, int size)
  179. {
  180.         thread tab[size];
  181.        
  182.         for (int i = 0; i < size; i++)
  183.         {
  184.                 tab[i] = thread(calculateRow, vector[i], matrix[i], helpMatrix, size, i);
  185.         }
  186.        
  187.         for (int i = 0; i < size; i++)
  188.         {
  189.                 tab[i].join();
  190.         }
  191. }
  192.  
  193. int * getResult(int **helpMatrix, int size)
  194. {
  195.         int * result = new int[size];
  196.         int rowSum = 0;
  197.        
  198.         for (int i = 0; i < size; i++)
  199.         {
  200.                 rowSum = 0;
  201.                
  202.                 for (int j = 0; j < size; j++)
  203.                 {
  204.                         rowSum += helpMatrix[i][j];
  205.                 }
  206.                
  207.                 result[i] = rowSum;
  208.         }
  209.        
  210.         return result;
  211. }
  212.  
  213. void dealocateMatrix(int **matrix, int size)
  214. {
  215.         for (int i = 0; i < size; i++)
  216.         {
  217.                 delete[] matrix[i];
  218.         }
  219.  
  220.         delete[] matrix;
  221.        
  222.         matrix = NULL;
  223. }
  224.  
  225. void dealocateVector(int *vector, int size)
  226. {
  227.         delete[] vector;
  228.        
  229.         vector = NULL;
  230. }
  231.  
  232.  
  233.