Amonin

Untitled

Dec 7th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. template <class T>
  5. class Matrix {
  6. private:
  7.     vector<vector<T>> m;
  8.  
  9. public:
  10.     Matrix(const vector<vector<T>>& mat) : m(mat) {}
  11.     friend ostream& operator<<(ostream& out, const Matrix<T>& mat) {
  12.         string line_sep;
  13.         for (auto& line : mat.m) {
  14.             out << line_sep;
  15.             string col_sep;
  16.             for (const auto& elem : line) {
  17.                 out << col_sep << elem;
  18.                 col_sep = "\t";
  19.             }
  20.             line_sep = "\n";
  21.         }
  22.         return out;
  23.     }
  24.     pair<size_t, size_t> size() const {
  25.         if (m.empty()) {
  26.             return{ 0, 0 };
  27.         } else {
  28.             return{ m.size(), m[0].size() };
  29.         }
  30.     }
  31.     Matrix& operator +=(Matrix& other) {
  32.         for (int i = 0; i < m.size(); ++i) {
  33.             for (int j = 0; j < m[0].size(); ++j) {
  34.                 m[i][j] += other.m[i][j];
  35.             }
  36.         }
  37.         return *this;
  38.     }
  39.     template <class D>
  40.     Matrix& operator *=(D lambda) {
  41.         for (unsigned int i = 0; i < m.size(); ++i) {
  42.             for (unsigned int j = 0; j < m[0].size(); ++j) {
  43.                 m[i][j] *= lambda;
  44.             }
  45.         }
  46.         return *this;
  47.     }
  48.     Matrix& transpose() {
  49.         int col = m[0].size();
  50.         int row = m.size();
  51.         vector<vector<T>> transp(col, vector<T>(row));
  52.         for (int i = 0; i < row; ++i) {
  53.             for (int j = 0; j < col; ++j) {
  54.                 transp[j][i] = m[i][j];
  55.             }
  56.         }
  57.         m = transp;
  58.         return *this;
  59.     }
  60.     Matrix transposed() const {
  61.         Matrix transp = m;
  62.         return transp.transpose();
  63.     }
  64.     Matrix& operator *=(const Matrix& other) {
  65.         int row1 = m.size();
  66.         int col2 = other.m[0].size();
  67.         int col1 = m[0].size();
  68.         vector<vector<T>> multip(row1, vector<T>(col2));
  69.         for (int i = 0; i < row1; ++i) {
  70.             for (int j = 0; j < col2; ++j) {
  71.                 for (int k = 0; k < col1; ++k) {
  72.                     multip[i][j] += m[i][k] * other.m[k][j];
  73.                 }
  74.             }
  75.         }
  76.         m = multip;
  77.         return *this;
  78.     }
  79. };
  80. template <class T>
  81. Matrix<T> operator + (Matrix<T> m1, const Matrix<T>& m2) {
  82.     return m1 += m2;
  83. }
  84. template <class T, class D>
  85. Matrix<T> operator * (Matrix<T> m1, const D& lambda) {
  86.     return m1 *= lambda;
  87. }
  88. template <class T>
  89. Matrix<T> operator * (Matrix<T> m1, const Matrix<T>& m2) {
  90.     return m1 *= m2;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment