Advertisement
HeroBaga

Untitled

Oct 4th, 2021
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.60 KB | None | 0 0
  1. #include <omp.h>
  2. #include <iostream>
  3. #include <math.h>
  4.  
  5. using namespace std;
  6.  
  7. float **alg_matmul2D_parallel(int m, int n, int p, float **a, float **b, float **c) {
  8. int i, j, k;
  9.  
  10. #pragma omp parallel for shared(a, b, c, m, n, p) private(i, j, k) default(none)
  11. for (i = 0; i < m; i = i + 1) {
  12. for (j = 0; j < n; j = j + 1) {
  13. a[i][j] = 0.;
  14. for (k = 0; k < p; k = k + 1) {
  15. a[i][j] += (b[i][k]) * (c[k][j]);
  16. }
  17. }
  18. }
  19.  
  20. return a;
  21. }
  22.  
  23.  
  24. float **alg_matmul2D(int m, int n, int p, float **a, float **b, float **c) {
  25. int i, j, k;
  26. for (i = 0; i < m; i = i + 1) {
  27. for (j = 0; j < n; j = j + 1) {
  28. a[i][j] = 0.;
  29. for (k = 0; k < p; k = k + 1) {
  30. a[i][j] += (b[i][k]) * (c[k][j]);
  31. }
  32. }
  33. }
  34.  
  35. return a;
  36. }
  37.  
  38. int GetMinor(float **a, float **b, int row, int col, int n) {
  39. int colc = 0, rowc = 0;
  40. for (int i = 0; i < n; i++) {
  41. if (i != row) {
  42. colc = 0;
  43. for (int j = 0; j < n; j++) {
  44. if (j != col) {
  45. b[rowc][colc] = a[i][j];
  46. colc++;
  47. }
  48. }
  49. rowc++;
  50. }
  51. }
  52. return 1;
  53. }
  54.  
  55. float CalcDeterminant(float **a, int n) {
  56. if (n == 1) {
  57. return a[0][0];
  58. }
  59. float det = 0;
  60. float **minor;
  61. minor = new float *[n - 1];
  62. for (int i = 0; i < n - 1; i++) {
  63. minor[i] = new float[n - 1];
  64. }
  65. for (int i = 0; i < n; i++) {
  66. GetMinor(a, minor, 0, i, n);
  67. det += (i % 2 == 1 ? -1.0 : 1.0) * a[0][i] * CalcDeterminant(minor, n - 1);
  68. }
  69. for (int i = 0; i < n - 1; i++) {
  70. delete[] minor[i];
  71. }
  72. delete[] minor;
  73. return det;
  74. }
  75.  
  76. float **MatrixInversion(float **a, int n, float **result) {
  77. double det = 1.0 / CalcDeterminant(a, n);
  78. float *temp = new float[(n - 1) * (n - 1)];
  79. float **minor = new float *[n - 1];
  80. for (int i = 0; i < n - 1; i++)
  81. minor[i] = temp + (i * (n - 1));
  82. for (int j = 0; j < n; j++) {
  83. for (int i = 0; i < n; i++) {
  84. GetMinor(a, minor, j, i, n);
  85. result[i][j] = det * CalcDeterminant(minor, n - 1);
  86. if ((i + j) % 2 == 1)
  87. result[i][j] = -result[i][j];
  88. }
  89. }
  90. delete[] temp;
  91. delete[] minor;
  92. return result;
  93. }
  94.  
  95. int main(int argc, char *argv[]) {
  96. // int m1 = atoi(argv[1]); // количество строк матрицы 1
  97. // int n1 = atoi(argv[2]); // количество столбцов матрицы 1
  98. // int m2 = atoi(argv[3]); // количество строк матрицы 2
  99. // int n2 = atoi(argv[4]); // количество столбцов матрицы 2
  100. // int seed = atoi(argv[5]); // сид рандома
  101. // int silent = atoi(argv[6]);
  102. //
  103. // if (m1 != n1) {
  104. // cout << "Первая матрица должна быть квадратной!" << endl;
  105. // return 0;
  106. // }
  107. // if (n1 != m2) {
  108. // cout << "Количество столбцов матрицы A должно равняться числу строк матрицы B!" << endl;
  109. // return 0;
  110. // }
  111.  
  112. int i, j;
  113. float **x; // матрица результатов
  114. float **x2; // матрица результатов
  115. float **a; // матрица A
  116. float **b; // матрица B
  117.  
  118. int m1, m2, n1, n2;
  119. cin >> m1 >> m2 >> n1 >> n2;
  120. x = new float *[m1];
  121. x2 = new float *[m1];
  122. a = new float *[m1];
  123. b = new float *[m2];
  124.  
  125. double t1parl, t2parl, t1posl, t2posl;
  126.  
  127. for (i = 0; i < m1; i = i + 1) {
  128. x[i] = new float[n2];
  129. x2[i] = new float[n2];
  130.  
  131. a[i] = new float[n1];
  132. }
  133. for (i = 0; i < m2; i = i + 1) {
  134. b[i] = new float[n2];
  135. }
  136.  
  137. // srand(seed);
  138.  
  139. for (i = 0; i < m1; i = i + 1) {
  140. for (j = 0; j < n1; j = j + 1) {
  141. a[i][j] = rand() % 10 + 1;
  142. }
  143. }
  144. // for (i = 0; i < m2; i = i + 1) {
  145. // for (j = 0; j < n2; j = j + 1) {
  146. // b[i][j] = rand() % 10 + 1;
  147. // }
  148. // }
  149. for (i = 0; i < m2; i = i + 1) {
  150. for (j = 0; j < n2; j = j + 1) {
  151. cout << a[i][j] << " ";
  152. }
  153. cout << endl;
  154. }
  155. cout << endl;
  156. b = MatrixInversion(a, m1, b);
  157. for (i = 0; i < m1; i = i + 1) {
  158. for (j = 0; j < m1; j = j + 1) {
  159. cout << b[i][j] << " ";
  160. }
  161. cout << endl;
  162. }
  163. //TODO куда убрал очистку памяти ???
  164. // for (i = 0; i < m2; i = i + 1) {
  165. // for (j = 0; j < n2; j = j + 1) {
  166. // cout << b[i][j] << " ";
  167. // }
  168. // cout << endl;
  169. // }
  170. // if (!silent) {
  171. // // вывод матрицы 1
  172. // for (i = 0; i < m1; i = i + 1) {
  173. // for (j = 0; j < n1; j = j + 1) {
  174. // cout << a[i][j] << ' ';
  175. // }
  176. // cout << '\n';
  177. // }
  178. //
  179. // cout << '\n';
  180. // cout << '\n';
  181. //
  182. // // вывод матрицы 2
  183. // for (i = 0; i < m2; i = i + 1) {
  184. // for (j = 0; j < n2; j = j + 1) {
  185. // cout << b[i][j] << ' ';
  186. // }
  187. // cout << '\n';
  188. // }
  189. // cout << '\n';
  190. // cout << '\n';
  191. // }
  192.  
  193. // float d = determinant(a, n1);
  194. // if (d == 0) {
  195. // cout << "Определитель матрицы A равен 0. Обратная матрица не может быть вычислена!" << endl;
  196. // return 0;
  197. // }
  198.  
  199.  
  200. return 0;
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement