Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. struct Fraction {
  6.     long long numerator;
  7.     long long denominator;
  8. };
  9.  
  10. int nod(Fraction& a) {}
  11.  
  12. Fraction shorten(Fraction& a) {
  13.     a.numerator /= nod(a);
  14.     a.denominator /= nod(a);
  15.     return a;
  16. }
  17.  
  18. Fraction operator*(Fraction& lhc, const Fraction& rhc) {
  19.     Fraction a = {lhc.numerator * rhc.numerator, lhc.denominator * rhc.denominator};
  20.     return shorten(a);
  21. }
  22.  
  23. struct Matrix {
  24.     vector<vector<int>> table; //сами числа в матрице
  25.     Fraction c; //коэффициент перед ней (работа с дробями пока не написана, поэтому можно не вникать)
  26.  
  27. };
  28.  
  29. Matrix readMatrix(int n, int m) {
  30.     vector<vector<int>> table(n, vector<int>(m, 0));
  31.     for (int i = 0; i != n; ++i) {
  32.         for (int j = 0; j != m; ++j) {
  33.             cin >> table[i][j];
  34.         }
  35.     }
  36.     return {table, {1, 1}};
  37. }
  38.  
  39. ostream& operator<<(ostream& stream, const Matrix m) {
  40.     for (int i = 0; i != m.table.size(); ++i) {
  41.         for (int j = 0; j != m.table[0].size(); ++j) {
  42.             stream << m.table[i][j] << '\t';
  43.         }
  44.         stream << '\n';
  45.     }
  46.     return stream;
  47. }
  48.  
  49. Matrix operator+(const Matrix& lhc, const Matrix& rhc) {
  50.     vector<vector<int>> t(lhc.table.size(), vector<int>(lhc.table[0].size(), 0));
  51.      for (int i = 0; i != t.size(); ++i) {
  52.          for (int j = 0; j != t[0].size(); ++j) {
  53.              t[i][j] = lhc.table[i][j] + rhc.table[i][j];
  54.          }
  55.      }
  56.     return {t, {1, 1}};
  57. }
  58.  
  59. Matrix operator-(const Matrix& lhc, const Matrix& rhc) {
  60.     vector<vector<int>> t(lhc.table.size(), vector<int>(lhc.table[0].size(), 0));
  61.     for (int i = 0; i != t.size(); ++i) {
  62.         for (int j = 0; j != t[0].size(); ++j) {
  63.             t[i][j] = lhc.table[i][j] - rhc.table[i][j];
  64.         }
  65.     }
  66.     return {t, {1, 1}};
  67. }
  68.  
  69. Matrix operator*(const Matrix& lhc, const Matrix& rhc) {
  70.     vector<vector<int>> t(lhc.table.size(), vector<int>(lhc.table[0].size(), 0));
  71.     for (int i = 0; i != t.size(); ++i) {
  72.         for (int j = 0; j != t[0].size(); ++j) {
  73.             for (int k = 0; k != lhc.table[0].size(); ++k) {
  74.                 t[i][j] += lhc.table[i][k]*rhc.table[k][j];
  75.             }
  76.         }
  77.     }
  78.     return {t, {1, 1}};
  79. }
  80.  
  81. Matrix operator*(const int& lhc, const Matrix& rhc) {
  82.     vector<vector<int>> t(rhc.table.size(), vector<int>(rhc.table[0].size(), 0));
  83.     for (int i = 0; i != t.size(); ++i) {
  84.         for (int j = 0; j != t[0].size(); ++j) {
  85.             t[i][j] = lhc * rhc.table[i][j];
  86.         }
  87.     }
  88.     return {t, {1, 1}};
  89. }
  90.  
  91. Matrix getMatrix(Matrix matrix, int k, int l) { //получение матрицы без k-ой строки и l-ого столбца
  92.     vector<vector<int>> t(matrix.table.size() - 1, vector<int>(matrix.table[0].size() - 1, 0));
  93.     for (int i = 0; i != matrix.table.size(); ++i) {
  94.         for (int j = 0; j != matrix.table[0].size(); ++j) {
  95.             if (i == k || j == l) {
  96.             } else if (i < k && j < l) {
  97.                 t[i][j] = matrix.table[i][j];
  98.             } else if (i < k && j > l) {
  99.                 t[i][j - 1] = matrix.table[i][j];
  100.             } else if (i > k && j < l) {
  101.                 t[i - 1][j] = matrix.table[i][j];
  102.             } else if (i > k && j > l) {
  103.                 t[i - 1][j - 1] = matrix.table[i][j];
  104.             }
  105.         }
  106.     }
  107.     return {t, {1, 1}};
  108. }
  109.  
  110. int determinant(Matrix matrix) {
  111.     int d = 0;
  112.     int power = 0;
  113.     if (matrix.table.size() == 1) {
  114.         return matrix.table[0][0];
  115.     } else {
  116.         for (int j = 0; j != matrix.table.size(); ++j) {
  117.             if (j % 2 == 0) {
  118.                 power = 1;
  119.             } else {
  120.                 power = -1;
  121.             }
  122.             d += power * matrix.table[0][j] * determinant(getMatrix(matrix, 0, j));
  123.         }
  124.         return d;
  125.     }
  126. }
  127.  
  128. Matrix invertibleMatrix(Matrix matrix){
  129.     int det = determinant(matrix);
  130.     int minus = 1;
  131.     vector<vector<int>> invertible = matrix.table;
  132.     for (int i = 0; i != matrix.table.size(); ++i) {
  133.         for (int j = 0; j != matrix.table.size(); ++j){
  134.             invertible[j][i] = minus * determinant(getMatrix(matrix, i, j));
  135.             minus *= -1;
  136.         }
  137.     }
  138.     return {invertible, {1, det}};
  139. }
  140.  
  141. Matrix lolMatrix(Matrix matrix, int k, int l, int x) { //прибавление к k-ой строке l-ой, умноженной на x
  142.     vector<vector<int>> t = matrix.table;
  143.     for (int j = 0; j != matrix.table[0].size(); ++j) {
  144.         t[k][j] += x * t[l][j];
  145.     }
  146.     return {t, {1, 1}};
  147. }
  148.  
  149. int operator*(const vector<int>& lhc, const vector<int>& rhc) { // скалярное произведение
  150.     int t = 0;
  151.     for (int i = 0; i != lhc.size(); ++i) {
  152.         t += lhc[i] * rhc[i];
  153.     }
  154.     return t;
  155. }
  156.  
  157. vector<int> operator*(const int& lhc, vector<int> rhc) { // скалярное произведение
  158.     for (int i = 0; i != rhc.size(); ++i) {
  159.         rhc[i] = lhc*rhc[i];
  160.     }
  161.     return rhc;
  162. }
  163.  
  164. vector<int> operator/(vector<int> lhc, const int& rhc) {
  165.     for (int i = 0; i != lhc.size(); ++i) {
  166.         lhc[i] = lhc[i]/rhc;
  167.     }
  168.     return lhc;
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement