Advertisement
999ms

Untitled

Nov 17th, 2019
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.58 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using ld = long double;
  5. const ld EPS = 1e-10;
  6.  
  7. struct Vector {
  8.     vector<ld> v;
  9.     int n;
  10.     Vector() {
  11.         cout << "Zero vector\n";
  12.     }
  13.     Vector(int n) : n(n), v(n) {};
  14.     Vector(const vector<ld>& o) : v(o), n(o.size()) {}
  15.     Vector operator + (Vector o) {
  16.         Vector ans = v;
  17.         if (ans.v.size() != o.v.size()) throw;
  18.         for (int i = 0; i < v.size(); i++) {
  19.             ans.v[i] += o[i];
  20.         }
  21.         return ans;
  22.     }
  23.     Vector operator - (Vector o) {
  24.         Vector ans = v;
  25.         if (ans.v.size() != o.v.size()) throw;
  26.         for (int i = 0; i < v.size(); i++) {
  27.             ans[i] -= o.v[i];
  28.         }
  29.         return ans;
  30.     }
  31.     ld operator * (Vector o) {
  32.         ld ans = 0;
  33.         for (int i = 0; i < v.size(); i++) {
  34.             ans += v[i] * o.v[i];
  35.         }
  36.         return ans;
  37.     }
  38.     Vector operator * (const ld d) {
  39.         Vector ans = v;
  40.         for (int i = 0; i < n; i++) {
  41.             ans[i] *= d;
  42.         }
  43.         return ans;
  44.     }
  45.     Vector operator / (const ld d) {
  46.         if (abs(d) < EPS) throw;
  47.         Vector ans = v;
  48.         for (int i = 0; i < v.size(); i++) {
  49.             ans[i] /= d;
  50.         }
  51.         return ans;
  52.     }
  53.     ld& operator [] (const int i) {
  54.         return v[i];
  55.     }
  56. };
  57.  
  58. struct Matrix {
  59.     vector<Vector> t;
  60.     int n;
  61.      Matrix(int n) : n(n) {
  62.         for (int i = 0; i < n; i++) {
  63.             t.emplace_back(n);
  64.         }
  65.     }
  66.     Matrix (const vector<Vector>& o) : t(o) {
  67.         n = o.size();
  68.     }
  69.     void Transponse() {
  70.         for (int i = 0; i < n; i++) {
  71.             for (int j = 0; j < i; j++) {
  72.                 swap(t[i][j], t[j][i]);
  73.             }
  74.         }
  75.     }
  76.     Vector& operator [] (const int i) {
  77.         return t[i];
  78.     }
  79.     Matrix operator * (Matrix& o) {
  80.         assert(n == o.n);
  81.         Matrix ans(n);
  82.         for (int i = 0; i < n; i++) {
  83.             for (int j = 0; j < n; j++) {
  84.                 for (int k = 0; k < n; k++) {
  85.                     ans[i][k] += t[i][j] * o[j][k];
  86.                 }
  87.             }
  88.         }
  89.         return ans;
  90.     }
  91.  
  92.     Matrix inv() {
  93.         Matrix ans(n);
  94.         for (int i = 0; i < n; i++) {
  95.             ans[i][i] = 1;
  96.         }
  97.         Matrix cur(t);
  98.         for (int i = 0; i < n; i++) {
  99.             int nxt = -1;
  100.             for (int j = i; j < n; j++) {
  101.                 if (abs(cur[i][j]) > EPS) {
  102.                     nxt = j;
  103.                     break;
  104.                 }
  105.             }
  106.  
  107.             if (nxt == -1) throw;
  108.  
  109.             if (nxt != i) {
  110.                 cur[i] = cur[i] + cur[nxt];
  111.                 ans[i] = ans[i] + ans[nxt];
  112.             }
  113.  
  114.             ans[i] = ans[i] / cur[i][i];
  115.             cur[i] = cur[i] / cur[i][i];
  116.  
  117.             for (int j = 0; j < n; j++) {
  118.                 if (i == j) continue;
  119.                 ans[j] = ans[j] - ans[i] * cur[j][i];
  120.                 cur[j] = cur[j] - cur[i] * cur[j][i];
  121.             }
  122.  
  123.         }
  124.         return ans;
  125.     };
  126.     void Print() {
  127.         for (int i = 0; i < n; i++) {
  128.             for (int j = 0; j < n; j++) {
  129.                 cout << fixed << setprecision(15) <<  t[i][j] << " ";
  130.             }
  131.             cout << "\n";
  132.         }
  133.         cout << "\n";
  134.     }
  135.  
  136. };
  137.  
  138. int main() {
  139.     const int n = 5;
  140.     Matrix a(n);
  141.     for (int i = 0; i < n; i++) {
  142.         for (int j = 0; j < n; j++) {
  143.             a[i][j] = rand() % 300;
  144.         }
  145.     }
  146.  
  147.     a.Print();
  148.     auto a_inv = a.inv();
  149.     a_inv.Print();
  150.     auto e = a * a_inv;
  151.     e.Print();
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement