Advertisement
habur331

Untitled

Mar 21st, 2022
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.37 KB | None | 0 0
  1. #include <fstream>
  2. #include <iomanip>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. long double calculateDeterminant(long double** matrix, int matrixSize);
  8.  
  9. long double calculateMinor(long double** matrix, int matrixSize, int row, int column);
  10.  
  11. long double** createMatrix(int rowNumber, int columnNumber)
  12. {
  13. auto** matrix = new long double* [rowNumber];
  14.  
  15. for (int i = 0; i < rowNumber; i++)
  16. matrix[i] = new long double[rowNumber];
  17.  
  18. for (int i = 0; i < rowNumber; i++)
  19. {
  20. for (int j = 0; j < rowNumber; j++)
  21. matrix[i][j] = 0;
  22. }
  23.  
  24. return matrix;
  25. }
  26.  
  27. void deleteMatrix(long double** matrix, int sizeMatrix)
  28. {
  29. for (int i = 0; i < sizeMatrix; i++)
  30. delete[] matrix[i];
  31.  
  32. delete matrix;
  33. }
  34.  
  35. void createNewMatrixOnBaseWithoutRowAndCol(long double** matrix, long double** newMatrix, int matrixSize, int row, int column)
  36. {
  37. bool skipRow = false;
  38.  
  39. for (int i = 0; i < matrixSize - 1; i++)
  40. {
  41. bool skipColumn = false;
  42.  
  43. if (row == i)
  44. skipRow = true;
  45.  
  46. for (int j = 0; j < matrixSize - 1; j++)
  47. {
  48. if (column == j)
  49. skipColumn = true;
  50.  
  51. newMatrix[i][j] = matrix[i + (skipRow == true ? 1 : 0)][j + (skipColumn == true ? 1 : 0)];
  52. }
  53. }
  54. }
  55.  
  56. long double calculateDeterminant(long double** matrix, int matrixSize)
  57. {
  58. static int initialSize = 0;
  59. if (initialSize == 0)
  60. initialSize = matrixSize;
  61.  
  62. long double ans = 0;
  63.  
  64. if (matrixSize == 1)
  65. return matrix[0][0];
  66. if (matrixSize == 2)
  67. return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
  68.  
  69. for (int i = 0; i < matrixSize; i++)
  70. {
  71. ans += matrix[0][i] * calculateMinor(matrix, matrixSize, 0, i);
  72. }
  73.  
  74. if (matrixSize != initialSize)
  75. deleteMatrix(matrix, matrixSize);
  76.  
  77. return ans;
  78. }
  79.  
  80. long double calculateMinor(long double** matrix, int matrixSize, int row, int column)
  81. {
  82. long double** newMatrix = createMatrix(matrixSize - 1, matrixSize - 1);
  83. createNewMatrixOnBaseWithoutRowAndCol(matrix, newMatrix, matrixSize, row, column);
  84.  
  85. return pow(-1, row + column) * calculateDeterminant(newMatrix, matrixSize - 1);
  86. }
  87.  
  88. void calculateInverseMatrix(long double** matrix, int matrixSize, long double** inverseMatrix)
  89. {
  90. long double determinant = calculateDeterminant(matrix, matrixSize);
  91.  
  92. for (int i = 0; i < matrixSize; i++)
  93. {
  94. for (int j = 0; j < matrixSize; j++)
  95. {
  96. inverseMatrix[j][i] = calculateMinor(matrix, matrixSize, i, j) / determinant;
  97. }
  98. }
  99. }
  100.  
  101. long double** multiplyMatrices(long double** a, int a_rowNumber, int a_columnNumber, long double** b, int b_rowNumber, int b_columnNumber)
  102. {
  103. if (a_columnNumber != b_rowNumber)
  104. throw exception("Multiplication of these matrices is impossible");
  105.  
  106. auto multiplicationMatrix = createMatrix(a_rowNumber, b_columnNumber);
  107.  
  108. for (int r_a = 0; r_a < a_rowNumber; r_a++)
  109. {
  110. for (int c_b = 0; c_b < b_columnNumber; c_b++)
  111. {
  112. long double result = 0.0;
  113.  
  114. for (int c_a = 0, r_b = 0; c_a < a_columnNumber && r_b < b_rowNumber; c_a++, r_b++)
  115. {
  116. result += a[r_a][c_a] * b[r_b][c_b];
  117. }
  118.  
  119. multiplicationMatrix[c_b][r_a] = result;
  120. }
  121. }
  122.  
  123. return multiplicationMatrix;
  124. }
  125.  
  126. long double** transposeMatrix(long double** a, int a_rowNumber, int a_columnNumber)
  127. {
  128. long double** result = createMatrix(a_columnNumber, a_rowNumber);
  129.  
  130. for (int i = 0; i < a_rowNumber; i++)
  131. {
  132. for (int j = 0; j < a_columnNumber; j++)
  133. {
  134. result[j][i] = a[i][j];
  135. }
  136. }
  137.  
  138. /*for (int i = 0; i < a_columnNumber; i++)
  139. {
  140. for (int j = 0; j < a_rowNumber; j++)
  141. {
  142. cout << result[i][j] << " ";
  143. }
  144. cout << endl;
  145. }*/
  146.  
  147.  
  148. return result;
  149. }
  150.  
  151. int main()
  152. {
  153. ifstream in("input.txt");
  154. ofstream out("output.txt");
  155. out << fixed << setprecision(2);
  156.  
  157. int n, m;
  158. in >> n >> m;
  159. n++;
  160.  
  161. auto A = createMatrix(m, n);
  162. auto b = createMatrix(m, 1);
  163.  
  164. for (int i = 0; i < m; i++)
  165. {
  166. for (int j = 0; j <= n; j++)
  167. {
  168. if (j == 0)
  169. A[i][0] = 1.0;
  170. else
  171. {
  172. if (j != n)
  173. in >> A[i][j];
  174. else in >> b[i][0];
  175. }
  176. }
  177. }
  178.  
  179. out << "A:\n";
  180. for (int i = 0; i < m; i++)
  181. {
  182. for (int j = 0; j < n; j++)
  183. out << A[i][j] << " ";
  184. out << "\n";
  185. }
  186.  
  187. out << "\nb:\n";
  188. for (int i = 0; i < m; i++)
  189. out << b[i][0] << "\n";
  190.  
  191. long double** A_T = transposeMatrix(A, m, n);
  192.  
  193. long double** A_T_A = multiplyMatrices(A_T, n, m, A, m, n);
  194. out << "\nA_T*A:\n";
  195. for (int i = 0; i < n; i++)
  196. {
  197. for (int j = 0; j < n; j++)
  198. out << A_T_A[i][j] << " ";
  199. out << "\n";
  200. }
  201.  
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement