Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <ostream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <cmath>
  6.  
  7. class Matrix: public std::vector<std::vector<double>> {
  8. public:
  9.   // конструкторы
  10.   Matrix () = default;
  11.   Matrix (int n, int m);
  12.  
  13.   // полуконструкторы
  14.   static Matrix eye(int n, double value = 1.0) {
  15.     Matrix t(n, n);
  16.  
  17.     for(int i = 0; i < n; ++i)
  18.       t[i][i] = value;
  19.  
  20.     return t;
  21.   }
  22.  
  23.   // операторы
  24.   Matrix operator* (const Matrix& other) const;
  25.  
  26.   // операции
  27.   void add_row_to_row(int n, int m, double factor = 1.0);
  28.   void swap_rows(int n, int m);
  29.   void multiply_row(int n, double factor);
  30.  
  31.   int find_pivot(int n, double EPS = 1e-07);
  32.   void set_zeros(double EPS = 1e-07);
  33.  
  34.   // алгебра
  35.   Matrix inverse() const;
  36.   double square_norm() const;
  37.  
  38.   // input and output
  39.   friend std::ostream& operator<< (std::ostream& os, const Matrix& m);
  40.   friend std::istream& operator>> (std::istream& is, Matrix& m);
  41. };
  42.  
  43. // конструкторы
  44. Matrix::Matrix(int n, int m):
  45. std::vector<std::vector<double>> (n, std::vector<double> (m, 0)) {}
  46.  
  47. // операторы
  48. Matrix Matrix::operator* (const Matrix& other) const {
  49.   // по столбцам a_1_1 ... a_1_n
  50.   // по строкам a_1_1 .. a_m_1
  51.   int m = this->size();
  52.   int n = (*this)[0].size();
  53.  
  54.   int other_m = other.size();
  55.   int other_n = other[0].size();
  56.  
  57.   Matrix t (m, other_n);
  58.  
  59.   for(int i = 0; i < m; ++i){
  60.     for(int j = 0; j < other_n; ++j){
  61.       for(int k = 0; k < n; ++k)
  62.         t[i][j] += (*this)[i][k] * other[k][j];
  63.     }
  64.   }
  65.  
  66.   return t;
  67. }
  68.  
  69. // операции
  70. void Matrix::add_row_to_row(int n, int m, double factor){
  71.   for(int j = 0; j < (*this)[0].size(); ++j)
  72.     (*this)[n][j] += factor * (*this)[m][j];
  73. }
  74.  
  75. void Matrix::swap_rows(int n, int m){
  76.   std::swap((*this)[n], (*this)[m]);
  77. }
  78.  
  79. void Matrix::multiply_row(int n, double factor){
  80.   for(int j = 0; j < (*this)[0].size(); ++j)
  81.     (*this)[n][j] *= factor;
  82. }
  83.  
  84. int Matrix::find_pivot(int n, double EPS){
  85.   for(int i = n; i < this->size(); ++i)
  86.     if(std::abs((*this)[i][n]) > EPS)
  87.       return i;
  88.  
  89.   return -1;
  90. }
  91.  
  92. void Matrix::set_zeros(double EPS){
  93.   for(auto& i: *this)
  94.     for(auto& j: i)
  95.       if(std::abs(j) < EPS)
  96.         j = 0;
  97. }
  98.  
  99. // алгебра
  100. Matrix Matrix::inverse() const {
  101.   Matrix t = (*this);
  102.   Matrix inversed = Matrix::eye(t.size());
  103.  
  104.   for(int i = 0; i < t.size(); ++i){
  105.     int pivot = t.find_pivot(i);
  106.  
  107.     t.swap_rows(i, pivot);
  108.     inversed.swap_rows(i, pivot);
  109.  
  110.     double factor = t[i][i];
  111.     t.multiply_row(i, 1.0 / factor);
  112.     inversed.multiply_row(i, 1.0 / factor);
  113.  
  114.     for(int j = 0; j < t.size(); ++j){
  115.       if(j != i){
  116.         factor = t[j][i];
  117.  
  118.         t.add_row_to_row(j, i, -factor);
  119.         inversed.add_row_to_row(j, i, -factor);
  120.       }
  121.     }
  122.   }
  123.  
  124.   return inversed;
  125. }
  126.  
  127. double Matrix::square_norm() const {
  128.   double norm = 0;
  129.  
  130.   for(auto&& i: *this){
  131.     for(auto&& j: i){
  132.       norm += j * j;
  133.     }
  134.   }
  135.  
  136.   return norm;
  137. };
  138.  
  139. // input and output
  140. std::ostream& operator<< (std::ostream& os, const Matrix& m) {
  141.   for(auto&& i: m){
  142.     for(auto&& j: i){
  143.       os << j << ' ';
  144.     }
  145.  
  146.     os << '\n';
  147.   }
  148.  
  149.   return os;
  150. }
  151.  
  152. std::istream& operator>> (std::istream& is, Matrix& m) {
  153.   for(auto& i: m)
  154.     for(auto& j: i)
  155.       is >> j;
  156.  
  157.   return is;
  158. }
  159.  
  160. Matrix generate_matrix(int n){
  161.     if(n < 3)
  162.         return Matrix::eye(n);
  163.  
  164.     Matrix t(n, n);
  165.  
  166.     t[0][0] = -1.0;
  167.     t[0][1] = 1.0;
  168.  
  169.     for(int i = 1; i < n - 1; ++i){
  170.         t[i][i - 1] = 1.0;
  171.         t[i][i] = -2.0;
  172.         t[i][i + 1] = 1.0;
  173.     }
  174.  
  175.     t[n - 1][n - 2] = 1.0;
  176.     t[n - 1][n - 1] = -((n - 1) * 1.0 / n);
  177.  
  178.     return t;
  179. }
  180.  
  181. int main(){
  182.  
  183.   return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement