Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <utility>
  4. #include <cassert>
  5.  
  6. using namespace std;
  7.  
  8. template<typename T>
  9. class Matrix {
  10. private:
  11. vector<vector<T>> m;
  12.  
  13. public:
  14. Matrix(const vector<vector<T>> &x) {
  15. m = x;
  16. }
  17.  
  18. pair<size_t, size_t> size() const {
  19. size_t a = m.size();
  20. size_t b = m[0].size();
  21. return {a, b};
  22. }
  23.  
  24. const vector<T> &operator[](size_t i) const {
  25. return m[i];
  26. }
  27.  
  28. vector<T> &operator[](size_t i) {
  29. return m[i];
  30. }
  31.  
  32. Matrix<T> &operator*=(const Matrix<T> &other) {
  33. assert(size().second == other.size().first);
  34. Matrix<T> tmp(*this);
  35. tmp = *this * other;
  36. *this = tmp;
  37. return *this;
  38. }
  39. };
  40.  
  41. template<typename T>
  42. std::ostream &operator<<(std::ostream &out, const Matrix<T> &m) {
  43. for (size_t i = 0; i < m.size().first; ++i) {
  44. for (size_t j = 0; j < m.size().second; ++j) {
  45. if (j != 0 && j != m.size().second) {
  46. out << '\t';
  47. }
  48. out << m[i][j];
  49. }
  50. if (i != m.size().first - 1) {
  51. out << '\n';
  52. }
  53. }
  54. return out;
  55. }
  56.  
  57. template<typename T>
  58. Matrix<T> &operator+=(Matrix<T> &m, const Matrix<T> &m_other) {
  59. for (size_t i = 0; i < m.size().first; ++i) {
  60. for (size_t j = 0; j < m.size().second; ++j) {
  61. m[i][j] += m_other[i][j];
  62. }
  63. }
  64. return m;
  65. }
  66.  
  67. template<typename T>
  68. Matrix<T> operator+(const Matrix<T> &m, const Matrix<T> &m_other) {
  69. Matrix<T> tmp(m);
  70. for (size_t i = 0; i < m.size().first; ++i) {
  71. for (size_t j = 0; j < m.size().second; ++j) {
  72. tmp[i][j] = m[i][j] + m_other[i][j];
  73. }
  74. }
  75. return tmp;
  76. }
  77.  
  78. template<typename T>
  79. Matrix<T> &operator*=(Matrix<T> &m, const int &ch) {
  80. for (size_t i = 0; i < m.size().first; ++i) {
  81. for (size_t j = 0; j < m.size().second; ++j) {
  82. m[i][j] *= ch;
  83. }
  84. }
  85. return m;
  86. }
  87.  
  88. template<typename T>
  89. Matrix<T> operator*(const Matrix<T> &m, const int &ch) {
  90. Matrix<T> tmp(m);
  91. for (size_t i = 0; i < m.size().first; ++i) {
  92. for (size_t j = 0; j < m.size().second; ++j) {
  93. tmp[i][j] = m[i][j] * ch;
  94. }
  95. }
  96. return tmp;
  97. }
  98.  
  99.  
  100. template<typename T>
  101. Matrix<T> operator*(const Matrix<T> &m, const Matrix<T> &other) {
  102. assert(m.size().second == other.size().first);
  103. vector<vector<T>> x;
  104. x.resize(m.size().first);
  105. for (size_t i = 0; i != m.size().first; ++i) {
  106. x[i].resize(other.size().second);
  107. for (size_t j = 0; j != other.size().second; ++j) {
  108. x[i][j] = T();
  109. }
  110. }
  111. Matrix<T> tmp(x);
  112. for (size_t i = 0; i < m.size().first; ++i) {
  113. for (size_t j = 0; j < other.size().second; ++j) {
  114. for (size_t k = 0; k < m.size().second; ++k) {
  115. tmp[i][j] += m[i][k] * other[k][j];
  116. }
  117. }
  118. }
  119. return tmp;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement