- #include <iostream>
- #include <cstdlib>
- #include <iomanip>
- #include <ctime>
- #include <thread>
- using namespace std;
- int ** allocateMatrix(int size);
- int * allocateVector(int size);
- void initializeMatrix(int **matrix, int size);
- void initializeVector(int *vector, int size);
- void showMatrix(int **matrix, int size);
- void showVector(int *vector, int size);
- void multiply(int **matrix, int *vector, int **helpMatrix, int size);
- void multiplyWithTreads(int **matrix, int *vector, int **helpMatrix, int size);
- int * getResult(int **helpMatrix, int size);
- void calculateRow(int number, int * matrixColumn, int **helpMatrix, int size, int row);
- void dealocateMatrix(int **matrix, int size);
- void dealocateVector(int *vector, int size);
- int main()
- {
- srand(time(NULL));
- int size = 0;
- cout << "Podaj rozmiar macierzy" << endl;
- cin >> size;
- cout << '\n';
- char gate = 'N';
- cout << "Wypisac macierze? [T/N]: ";
- cin >> gate;
- cout << '\n';
- clock_t start;
- double duration;
- start = clock();
- int **matrix = allocateMatrix(size);
- int *vector = allocateVector(size);
- int **helpMatrix = allocateMatrix(size);
- initializeMatrix(matrix, size);
- initializeVector(vector, size);
- if (gate == 'T')
- {
- cout << "Macierz:" << endl;
- showMatrix(matrix, size);
- cout << endl;
- cout << endl << "Vector:" << endl;
- showVector(vector, size);
- cout << endl;
- }
- cout << endl << "Start..." << endl;
- multiply(matrix, vector, helpMatrix, size);
- int * result1 = getResult(helpMatrix, size);
- if (gate == 'T')
- {
- showVector(result1, size);
- }
- cout << endl << "End..." << endl;
- duration = ( clock() - start ) / (double) CLOCKS_PER_SEC;
- cout << endl << endl << "Czas: "<< duration << " [s]\n";
- start = clock();
- cout << endl << "Start with threads..." << endl;
- multiplyWithTreads(matrix, vector, helpMatrix, size);
- int * result2 = getResult(helpMatrix, size);
- if (gate == 'T')
- {
- showVector(result2, size);
- }
- cout << endl << "End with threads..." << endl;
- duration = ( clock() - start ) / (double) CLOCKS_PER_SEC;
- cout << endl << endl << "Czas: "<< duration << " [s]\n";
- dealocateMatrix(matrix, size);
- dealocateMatrix(helpMatrix, size);
- dealocateVector(vector, size);
- dealocateVector(result1, size);
- dealocateVector(result2, size);
- cin >> size;
- return 0;
- }
- int ** allocateMatrix(int size)
- {
- int ** matrix = new int *[size];
- for (int i = 0; i < size; i++)
- {
- matrix[i] = new int[size];
- }
- return matrix;
- }
- int * allocateVector(int size)
- {
- int * vector = new int [size];
- return vector;
- }
- void initializeMatrix(int **matrix, int size)
- {
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < size; j++)
- {
- matrix[i][j] = rand() % 101;
- }
- }
- }
- void initializeVector(int *vector, int size)
- {
- for (int i = 0; i < size; i++)
- {
- vector[i] = rand() % 101;
- }
- }
- void showMatrix(int **matrix, int size)
- {
- for (int i = 0; i < size; i++)
- {
- for (int j = 0; j < size; j++)
- {
- cout << setw(6) << matrix[i][j];
- }
- cout << '\n';
- }
- cout << '\n';
- }
- void showVector(int *vector, int size)
- {
- for (int i = 0; i < size; i++)
- {
- cout << setw(6) << vector[i];
- }
- }
- void calculateRow(int number, int * matrixColumn, int **helpMatrix, int size, int row)
- {
- for (int i = 0; i < size; i++)
- {
- helpMatrix[row][i] = number * matrixColumn[i];
- }
- }
- void multiply(int **matrix, int *vector, int **helpMatrix, int size)
- {
- for (int i = 0; i < size; i++)
- {
- calculateRow(vector[i], matrix[i], helpMatrix, size, i);
- }
- }
- void multiplyWithTreads(int **matrix, int *vector, int **helpMatrix, int size)
- {
- thread tab[size];
- for (int i = 0; i < size; i++)
- {
- tab[i] = thread(calculateRow, vector[i], matrix[i], helpMatrix, size, i);
- }
- for (int i = 0; i < size; i++)
- {
- tab[i].join();
- }
- }
- int * getResult(int **helpMatrix, int size)
- {
- int * result = new int[size];
- int rowSum = 0;
- for (int i = 0; i < size; i++)
- {
- rowSum = 0;
- for (int j = 0; j < size; j++)
- {
- rowSum += helpMatrix[i][j];
- }
- result[i] = rowSum;
- }
- return result;
- }
- void dealocateMatrix(int **matrix, int size)
- {
- for (int i = 0; i < size; i++)
- {
- delete[] matrix[i];
- }
- delete[] matrix;
- matrix = NULL;
- }
- void dealocateVector(int *vector, int size)
- {
- delete[] vector;
- vector = NULL;
- }