Dzham

Untitled

Feb 25th, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.26 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. #include <vector>
  4.  
  5. template <typename T>
  6. class Matrix {
  7. private:
  8. std::vector<T> data = {};
  9. size_t columns = 0;
  10. size_t lines = 0;
  11.  
  12. public:
  13. Matrix() = default;
  14.  
  15. Matrix(const std::vector<std::vector<T>>& v) {
  16. columns = v[0].size();
  17. lines = v.size();
  18. data.resize(v.size() * v[0].size());
  19. for (size_t i = 0; i < v.size(); ++i) {
  20. for (size_t j = 0; j < v[0].size(); ++j) {
  21. data[i * columns + j] = v[i][j];
  22. }
  23. }
  24. columns = v[0].size();
  25. lines = v.size();
  26. }
  27.  
  28. Matrix(const std::vector<T>& v, size_t c, size_t l) {
  29. data = v;
  30. columns = c;
  31. lines = l;
  32. }
  33.  
  34. const T& element(size_t i, size_t j) const {
  35. return data[i * columns + j];
  36. }
  37.  
  38. std::pair<size_t, size_t> size() const {
  39. return std::make_pair(lines, columns);
  40. }
  41.  
  42. const std::vector<T>& elements() const {
  43. return data;
  44. }
  45.  
  46. Matrix<T>& operator+= (const Matrix<T>& m) {
  47. for (size_t i = 0; i < data.size(); ++i) {
  48. data[i] += m.elements()[i];
  49. }
  50. return *this;
  51. }
  52.  
  53. template <typename K>
  54. Matrix<T>& operator*= (const K& k) {
  55. for (size_t i = 0; i < data.size(); ++i) {
  56. data[i] *= k;
  57. }
  58. return *this;
  59. }
  60.  
  61. Matrix<T>& transpose() {
  62. std::vector<T> new_data(data.size());
  63. for (size_t i = 0; i < columns; ++i) {
  64. for (size_t j = 0; j < lines; ++j) {
  65. new_data[i * lines + j] = this->element(j, i);
  66. }
  67. }
  68. data = std::move(new_data);
  69. std::swap(columns, lines);
  70. return *this;
  71. }
  72.  
  73. Matrix<T> transposed() const {
  74. std::vector<T> new_data(data.size());
  75. for (size_t i = 0; i < columns; ++i) {
  76. for (size_t j = 0; j < lines; ++j) {
  77. new_data[i * lines + j] = this->element(j, i);
  78. }
  79. }
  80. Matrix<T> m(new_data, lines, columns);
  81. return m;
  82. }
  83.  
  84. Matrix<T>& operator*= (const Matrix<T>& m) {
  85. std::pair<size_t, size_t> p = m.size();
  86. assert(columns == p.first);
  87. std::vector<T> new_data(lines * p.second);
  88. size_t curr_line = 0;
  89. size_t curr_column = 0;
  90. for (size_t k = 0; k < new_data.size(); ++k) {
  91. T t = T();
  92. if (curr_column > p.second - 1) {
  93. curr_line++;
  94. curr_column = 0;
  95. }
  96. for (size_t i = 0; i < columns; ++i) {
  97. t += this->element(curr_line, i) * m.element(i, curr_column);
  98. }
  99. new_data[k] = t;
  100. curr_column++;
  101. }
  102. data = std::move(new_data);
  103. columns = m.size().second;
  104. return *this;
  105. }
  106.  
  107. typename std::vector<T>::iterator begin() {
  108. return data.begin();
  109. }
  110.  
  111. typename std::vector<T>::iterator end() {
  112. return data.end();
  113. }
  114.  
  115. typename std::vector<T>::const_iterator begin() const {
  116. return data.begin();
  117. }
  118.  
  119. typename std::vector<T>::const_iterator end() const {
  120. return data.end();
  121. }
  122. };
  123.  
  124. template <typename T>
  125. Matrix<T> operator + (const Matrix<T>& p1, const Matrix<T>& p2) {
  126. Matrix<T> result = p1;
  127. return result += p2;
  128. }
  129.  
  130. template <typename T, typename K>
  131. Matrix<T> operator * (const Matrix<T>& p, const K& k) {
  132. Matrix<T> result = p;
  133. return result *= k;
  134. }
  135.  
  136. template <typename T, typename K>
  137. Matrix<T> operator * (const K& k, const Matrix<T>& p) {
  138. Matrix<T> result = p;
  139. return result *= k;
  140. }
  141.  
  142. template <typename T>
  143. Matrix<T> operator * (const Matrix<T>& p1, const Matrix<T>& p2) {
  144. Matrix<T> result = p1;
  145. return result *= p2;
  146. }
  147.  
  148. template <typename T>
  149. std::ostream& operator << (std::ostream& out, const Matrix<T>& m) {
  150. size_t i = 0;
  151. for (i = 0; i < m.size().first - 1; ++i) {
  152. out << m.element(i, 0);
  153. for (size_t j = 1; j < m.size().second; ++j) {
  154. out << '\t' << m.element(i, j);
  155. }
  156. out << '\n';
  157. }
  158. out << m.element(i, 0);
  159. for (size_t j = 1; j < m.size().second; ++j) {
  160. out << '\t' << m.element(i, j);
  161. }
  162. return out;
  163. }
Add Comment
Please, Sign In to add comment