#include #include #include #include #include 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; }