Advertisement
Dzham

Untitled

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