Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <omp.h>
- #include <iostream>
- #include <math.h>
- using namespace std;
- float **alg_matmul2D_parallel(int m, int n, int p, float **a, float **b, float **c) {
- int i, j, k;
- #pragma omp parallel for shared(a, b, c, m, n, p) private(i, j, k) default(none)
- for (i = 0; i < m; i = i + 1) {
- for (j = 0; j < n; j = j + 1) {
- a[i][j] = 0.;
- for (k = 0; k < p; k = k + 1) {
- a[i][j] += (b[i][k]) * (c[k][j]);
- }
- }
- }
- return a;
- }
- float **alg_matmul2D(int m, int n, int p, float **a, float **b, float **c) {
- int i, j, k;
- for (i = 0; i < m; i = i + 1) {
- for (j = 0; j < n; j = j + 1) {
- a[i][j] = 0.;
- for (k = 0; k < p; k = k + 1) {
- a[i][j] += (b[i][k]) * (c[k][j]);
- }
- }
- }
- return a;
- }
- int GetMinor(float **a, float **b, int row, int col, int n) {
- int colc = 0, rowc = 0;
- for (int i = 0; i < n; i++) {
- if (i != row) {
- colc = 0;
- for (int j = 0; j < n; j++) {
- if (j != col) {
- b[rowc][colc] = a[i][j];
- colc++;
- }
- }
- rowc++;
- }
- }
- return 1;
- }
- float CalcDeterminant(float **a, int n) {
- if (n == 1) {
- return a[0][0];
- }
- float det = 0;
- float **minor;
- minor = new float *[n - 1];
- for (int i = 0; i < n - 1; i++) {
- minor[i] = new float[n - 1];
- }
- for (int i = 0; i < n; i++) {
- GetMinor(a, minor, 0, i, n);
- det += (i % 2 == 1 ? -1.0 : 1.0) * a[0][i] * CalcDeterminant(minor, n - 1);
- }
- for (int i = 0; i < n - 1; i++) {
- delete[] minor[i];
- }
- delete[] minor;
- return det;
- }
- float **MatrixInversion(float **a, int n, float **result) {
- double det = 1.0 / CalcDeterminant(a, n);
- float *temp = new float[(n - 1) * (n - 1)];
- float **minor = new float *[n - 1];
- for (int i = 0; i < n - 1; i++)
- minor[i] = temp + (i * (n - 1));
- for (int j = 0; j < n; j++) {
- for (int i = 0; i < n; i++) {
- GetMinor(a, minor, j, i, n);
- result[i][j] = det * CalcDeterminant(minor, n - 1);
- if ((i + j) % 2 == 1)
- result[i][j] = -result[i][j];
- }
- }
- delete[] temp;
- delete[] minor;
- return result;
- }
- int main(int argc, char *argv[]) {
- // int m1 = atoi(argv[1]); // количество строк матрицы 1
- // int n1 = atoi(argv[2]); // количество столбцов матрицы 1
- // int m2 = atoi(argv[3]); // количество строк матрицы 2
- // int n2 = atoi(argv[4]); // количество столбцов матрицы 2
- // int seed = atoi(argv[5]); // сид рандома
- // int silent = atoi(argv[6]);
- //
- // if (m1 != n1) {
- // cout << "Первая матрица должна быть квадратной!" << endl;
- // return 0;
- // }
- // if (n1 != m2) {
- // cout << "Количество столбцов матрицы A должно равняться числу строк матрицы B!" << endl;
- // return 0;
- // }
- int i, j;
- float **x; // матрица результатов
- float **x2; // матрица результатов
- float **a; // матрица A
- float **b; // матрица B
- int m1, m2, n1, n2;
- cin >> m1 >> m2 >> n1 >> n2;
- x = new float *[m1];
- x2 = new float *[m1];
- a = new float *[m1];
- b = new float *[m2];
- double t1parl, t2parl, t1posl, t2posl;
- for (i = 0; i < m1; i = i + 1) {
- x[i] = new float[n2];
- x2[i] = new float[n2];
- a[i] = new float[n1];
- }
- for (i = 0; i < m2; i = i + 1) {
- b[i] = new float[n2];
- }
- // srand(seed);
- for (i = 0; i < m1; i = i + 1) {
- for (j = 0; j < n1; j = j + 1) {
- a[i][j] = rand() % 10 + 1;
- }
- }
- // for (i = 0; i < m2; i = i + 1) {
- // for (j = 0; j < n2; j = j + 1) {
- // b[i][j] = rand() % 10 + 1;
- // }
- // }
- for (i = 0; i < m2; i = i + 1) {
- for (j = 0; j < n2; j = j + 1) {
- cout << a[i][j] << " ";
- }
- cout << endl;
- }
- cout << endl;
- b = MatrixInversion(a, m1, b);
- for (i = 0; i < m1; i = i + 1) {
- for (j = 0; j < m1; j = j + 1) {
- cout << b[i][j] << " ";
- }
- cout << endl;
- }
- //TODO куда убрал очистку памяти ???
- // for (i = 0; i < m2; i = i + 1) {
- // for (j = 0; j < n2; j = j + 1) {
- // cout << b[i][j] << " ";
- // }
- // cout << endl;
- // }
- // if (!silent) {
- // // вывод матрицы 1
- // for (i = 0; i < m1; i = i + 1) {
- // for (j = 0; j < n1; j = j + 1) {
- // cout << a[i][j] << ' ';
- // }
- // cout << '\n';
- // }
- //
- // cout << '\n';
- // cout << '\n';
- //
- // // вывод матрицы 2
- // for (i = 0; i < m2; i = i + 1) {
- // for (j = 0; j < n2; j = j + 1) {
- // cout << b[i][j] << ' ';
- // }
- // cout << '\n';
- // }
- // cout << '\n';
- // cout << '\n';
- // }
- // float d = determinant(a, n1);
- // if (d == 0) {
- // cout << "Определитель матрицы A равен 0. Обратная матрица не может быть вычислена!" << endl;
- // return 0;
- // }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement