Advertisement
Sivoha

Untitled

Apr 23rd, 2022
961
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4. #include <string>
  5. #include <sstream>
  6.  
  7. using namespace std;
  8.  
  9. template <typename Type>
  10. class Matrix {
  11. private:
  12.     size_t rows, columns;
  13. public:
  14.     vector<vector<Type>> values;
  15.     Matrix();
  16.     Matrix(size_t, size_t);
  17.     Matrix(ifstream&);
  18.     Matrix(Matrix<Type>&);
  19.     ~Matrix();
  20.     static Matrix<int> null_matrix(size_t);
  21.     static Matrix<int> identity_matrix(size_t);
  22.     void load_matrix(ifstream&);
  23.     ofstream& save_matrix(ofstream&);
  24.     double find_determinant();
  25.     void print_matrix();
  26.  
  27.     friend Matrix<Type> operator * (Matrix<Type> m1, Matrix<Type> m2) {
  28.         if (m1.columns != m2.rows) {
  29.             cerr << "ERROR: invalid arguments";
  30.             exit(-1);
  31.         }
  32.         Matrix<Type> prod(m1.rows, m2.columns);
  33.         for (size_t i = 0; i < prod.rows; ++i) {
  34.             for (size_t j = 0; j < prod.columns; ++j) {
  35.                 for (size_t k = 0; k < m1.columns; ++k) {
  36.                     prod.values[i][j] += m1.values[i][k] * m2.values[k][j];
  37.                 }
  38.             }
  39.         }
  40.         return prod;
  41.     };
  42.  
  43.     friend Matrix<Type> operator * (Matrix<Type> m, double p) {
  44.         Matrix<Type> prod(m.rows, m.columns);
  45.         for (size_t i = 0; i < prod.rows; ++i) {
  46.             for (size_t j = 0; j < prod.columns; ++j) {
  47.                 prod.values[i][j] = m.values[i][j] * p;
  48.             }
  49.         }
  50.         return prod;
  51.     };
  52.     friend Matrix<Type> operator * (double p, Matrix<Type> m) {
  53.         return m * p;
  54.     };
  55.     friend Matrix<Type> operator + (Matrix<Type> m1, Matrix<Type> m2) {
  56.         if ((m1.columns != m2.columns) || (m1.rows != m2.rows)) {
  57.             cerr << "ERROR: invalid arguments";
  58.             exit(-1);
  59.         }
  60.         Matrix<Type> sum(m1.rows, m1.columns);
  61.         for (size_t i = 0; i < sum.rows; ++i) {
  62.             for (size_t j = 0; j < sum.columns; ++j) {
  63.                 sum.values[i][j] = m1.values[i][j] + m2.values[i][j];
  64.             }
  65.         }
  66.         return sum;
  67.     };
  68.  
  69.     friend Matrix<Type> operator - (Matrix<Type> m1, Matrix<Type> m2) {
  70.         if ((m1.columns != m2.columns) || (m1.rows != m2.rows)) {
  71.             cerr << "ERROR: invalid arguments";
  72.             exit(-1);
  73.         }
  74.         Matrix<Type> sum(m1.rows, m1.columns);
  75.         for (size_t i = 0; i < sum.rows; ++i) {
  76.             for (size_t j = 0; j < sum.columns; ++j) {
  77.                 sum.values[i][j] = m1.values[i][j] - m2.values[i][j];
  78.             }
  79.         }
  80.         return sum;
  81.     };
  82.  
  83.     friend bool operator == (Matrix<Type> m1, Matrix<Type> m2) {
  84.         if ((m1.columns != m2.columns) || (m1.rows != m2.rows)) {
  85.             return false;
  86.         }
  87.         for (size_t i = 0; i < m1.rows; ++i) {
  88.             for (size_t j = 0; j < m1.columns; ++j) {
  89.                 if (m1.values[i][j] != m2.values[i][j]) {
  90.                     return false;
  91.                 }
  92.             }
  93.         }
  94.         return true;
  95.     };
  96.  
  97.     friend bool operator == (Matrix<Type> m, int p) {
  98.         if ((p != 0) && (p != 1)) {
  99.             cerr << "ERROR: invalid arguments";
  100.             exit(-1);
  101.         }
  102.         if (p == 0) {
  103.             for (size_t i = 0; i < m.rows; ++i) {
  104.                 for (size_t j = 0; j < m.columns; ++j) {
  105.                     if (m.values[i][j] != 0) {
  106.                         return false;
  107.                     }
  108.                 }
  109.             }
  110.         }
  111.         else {
  112.             for (size_t i = 0; i < m.rows; ++i) {
  113.                 for (size_t j = 0; j < m.columns; ++j) {
  114.                     if (i == j) {
  115.                         if (m.values[i][j] != 1) {
  116.                             return false;
  117.                         }
  118.                     }
  119.                     else if (m.values[i][j] != 0) {
  120.                         return false;
  121.                     }
  122.                 }
  123.             }
  124.         }
  125.         return true;
  126.     };
  127.     friend bool operator == (int p, Matrix<Type> m) {
  128.         return m == p;
  129.     };
  130.  
  131.     Matrix<Type>& operator = (Matrix<Type>& m) {
  132.         this->rows = m.rows;
  133.         this->columns = m.columns;
  134.         cout << m.values.size() << endl;
  135.         this->values = m.values;
  136.         return *this;
  137.     };
  138.  
  139.     friend void operator >> (ifstream& in, Matrix<Type>& m) {
  140.         string s;
  141.         int k, i = 0;
  142.         m.values.clear();
  143.         vector<Type> v;
  144.         while (getline(in, s)) {
  145.             m.values.push_back(v);
  146.             stringstream ss;
  147.             ss << s << endl;
  148.             while (ss >> k) {
  149.                 m.values[i].push_back(k);
  150.             }
  151.             i++;
  152.         }
  153.         m.rows = i;
  154.         m.columns = m.values[0].size();
  155.     }
  156.  
  157.     friend ofstream& operator << (ofstream& out, Matrix<Type>& m) {
  158.         for (size_t i = 0; i < m.rows; ++i) {
  159.             for (size_t j = 0; j < m.columns; ++j) {
  160.                 out << m.values[i][j] << " ";
  161.             }
  162.             out << endl;
  163.         }
  164.         return out;
  165.     }
  166.  
  167.     friend Matrix<double> operator ! (Matrix<Type> m) {
  168.         double det = m.find_determinant();
  169.         if (det == 0) {
  170.             std::cerr << "ERROR: determinant = 0";
  171.             exit(-1);
  172.         }
  173.         size_t order = m.rows;
  174.         Matrix<double> minors_matrix(order, order);
  175.         for (size_t i = 0; i < order; ++i) {
  176.             for (size_t j = 0; j < order; ++j) {
  177.                 Matrix<Type> minor(order - 1, order - 1);
  178.                 for (size_t k = 0; k < order; ++k) {
  179.                     for (size_t l = 0; l < order; ++l) {
  180.                         if ((l != j) && (k != i)) {
  181.                             minor.values[k - 1 * (k > i)][l - 1 * (l > j)] = m.values[k][l];
  182.                         }
  183.                     }
  184.                 }
  185.                 minors_matrix.values[i][j] = minor.find_determinant();
  186.             }
  187.         }
  188.         for (size_t i = 0; i < order; ++i) {
  189.             for (size_t j = 0; j < order; ++j) {
  190.                 minors_matrix.values[i][j] *= pow(-1, i + j);
  191.             }
  192.         }
  193.         Matrix<double> tr_minors_matrix(order, order);
  194.         for (size_t i = 0; i < order; ++i) {
  195.             for (size_t j = 0; j < order; ++j) {
  196.                 tr_minors_matrix.values[i][j] = minors_matrix.values[j][i] * (1 / det);
  197.             }
  198.         }
  199.         return tr_minors_matrix;
  200.     }
  201. };
  202.  
  203. template <typename Type>
  204. Matrix<Type>::Matrix() : rows(0), columns(0) {};
  205.  
  206. template <typename Type>
  207. Matrix<Type>::Matrix(size_t rows, size_t columns) : rows(rows), columns(columns) {
  208.     Type* a = new Type();
  209.     for (size_t i = 0; i < this->rows; ++i) {
  210.         vector<Type> v;
  211.         this->values.push_back(v);
  212.         for (size_t j = 0; j < this->columns; ++j) {
  213.             this->values[i].push_back(*a);
  214.         }
  215.     }
  216. };
  217.  
  218. template <typename Type>
  219. Matrix<Type>::Matrix(ifstream& in) {
  220.     if (!(in >> this->rows >> this->columns)) {
  221.         cerr << "ERROR: invalid value";
  222.         exit(-1);
  223.     }
  224.     Type data;
  225.     for (size_t i = 0; i < this->rows; ++i) {
  226.         vector<Type> v;
  227.         this->values.push_back(v);
  228.         for (size_t j = 0; j < this->columns; ++j) {
  229.             if (!(in >> data)) {
  230.                 cerr << "ERROR: invalid value";
  231.                 exit(-1);
  232.             }
  233.             this->values[i].push_back(data);
  234.         }
  235.     }
  236. }
  237.  
  238. template<typename Type>
  239. Matrix<Type>::Matrix(Matrix<Type>& m) : rows(m.rows), columns(m.columns), values(m.values) {};
  240.  
  241. template <typename Type>
  242. Matrix<Type>::~Matrix() {};
  243.  
  244. template <typename Type>
  245. Matrix<int> Matrix<Type>::null_matrix(size_t n) {
  246.     Matrix<int> m(n, n);
  247.     return m;
  248. }
  249.  
  250. template <typename Type>
  251. Matrix<int> Matrix<Type>::identity_matrix(size_t n) {
  252.     Matrix<int> m(n, n);
  253.     for (size_t i = 0; i < n; ++i) {
  254.         for (size_t j = 0; j < n; ++j) {
  255.             m.values[i][j] += i == j;
  256.         }
  257.     }
  258.     return m;
  259. }
  260.  
  261. template <typename Type>
  262. void Matrix<Type>::load_matrix(ifstream& in) {
  263.     if (!(in >> this->rows >> this->columns)) {
  264.         cerr << "ERROR: invalid value";
  265.         exit(-1);
  266.     }
  267.     this->values.clear();
  268.     vector<Type> v;
  269.     Type elem;
  270.     for (size_t i = 0; i < this->rows; ++i) {
  271.         this->values.push_back(v);
  272.         for (size_t j = 0; j < this->columns; ++j) {
  273.             if (!(in >> elem)) {
  274.                 cerr << "ERROR: invalid value";
  275.                 exit(-1);
  276.             }
  277.             this->values[i].push_back(elem);
  278.         }
  279.     }
  280. }
  281.  
  282. template <typename Type>
  283. ofstream& Matrix<Type>::save_matrix(ofstream& out) {
  284.     out << this->rows << " " << this->columns << endl;
  285.     for (size_t i = 0; i < this->rows; ++i) {
  286.         for (size_t j = 0; j < this->columns; ++j) {
  287.             out << this->values[i][j] << " ";
  288.         }
  289.         out << endl;
  290.     }
  291.     return out;
  292. }
  293.  
  294. template <typename Type>
  295. double Matrix<Type>::find_determinant() {
  296.     if (rows != columns) {
  297.         cerr << "ERROR: not square matrix";
  298.         exit(-1);
  299.     }
  300.     size_t order = rows;
  301.     double det = 0;
  302.     if (order == 2) {
  303.         det = values[0][0] * values[1][1] - values[0][1] * values[1][0];
  304.     }
  305.     else {
  306.         for (size_t j = 0; j < order; ++j) {
  307.             Matrix<Type> minor(order - 1, order - 1);
  308.             for (size_t k = 1; k < order; ++k) {
  309.                 for (size_t l = 0; l < order; ++l) {
  310.                     if (l != j) {
  311.                         minor.values[k - 1][l - 1 * (l > j)] = values[k][l];
  312.                     }
  313.                 }
  314.             }
  315.             det += pow(-1, j % 2) * values[0][j] * minor.find_determinant();
  316.         }
  317.     }
  318.     return det;
  319. }
  320.  
  321. template <typename Type>
  322. void Matrix<Type>::print_matrix() {
  323.     for (size_t i = 0; i < this->rows; ++i) {
  324.         for (size_t j = 0; j < this->columns; ++j) {
  325.             cout << this->values[i][j] << " ";
  326.         }
  327.         cout << endl;
  328.     }
  329.     cout << endl;
  330. }
  331.  
  332. int main() {
  333.     ifstream in("D:/Documents/txt/input_matrix.txt");
  334.     ofstream out("D:/Documents/txt/output_matrix.txt");
  335.     if (!in || !out) {
  336.         cerr << "ERROR: error opening file";
  337.         return -1;
  338.     }
  339.     else {
  340.         cout << "files opened" << std::endl;
  341.     }
  342.     Matrix<int> a(in);
  343.     Matrix<double> b;  
  344.     b = !a;
  345.     b.print_matrix();
  346. }
  347.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement