Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdint>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7. using int32 = int32_t;
  8.  
  9. template <typename T>
  10. class Matrix {
  11. private:
  12. vector<T> data_;
  13. size_t row_, column_;
  14.  
  15. public:
  16. Matrix(const vector<vector<T>>& matrix) {
  17. row_ = matrix.size();
  18. column_ = matrix[0].size();
  19. data_.reserve(row_ * column_);
  20. for (size_t i = 0; i != row_; ++i) {
  21. for (size_t j = 0; j != column_; ++j) {
  22. data_.push_back(matrix[i][j]);
  23. }
  24. }
  25. }
  26.  
  27. pair<size_t, size_t> size() const {
  28. return {row_, column_};
  29. }
  30.  
  31. const T& operator[](const size_t& number_element) const {
  32. return data_[number_element];
  33. }
  34.  
  35. Matrix& operator+=(const Matrix<T>& second) {
  36. for (size_t i = 0; i < row_ * column_; ++i) {
  37. data_[i] += second[i];
  38. }
  39. return *this;
  40. }
  41.  
  42. Matrix operator+(const Matrix<T>& second) const {
  43. Matrix<T> buffer = *this;
  44. return buffer += second;
  45. }
  46.  
  47. template <typename V>
  48. Matrix& operator*=(const V& second) {
  49. for (size_t i = 0; i < row_ * column_; ++i) {
  50. data_[i] *= second;
  51. }
  52. return *this;
  53. }
  54.  
  55. template <typename V>
  56. Matrix operator*(const V& second) const {
  57. Matrix<T> buffer = *this;
  58. return buffer *= second;
  59. }
  60.  
  61. Matrix& transpose() {
  62. vector<vector<int32>> buffer;
  63. buffer.resize(column_);
  64. for (size_t row = 0; row < column_; ++row) {
  65. buffer[row].reserve(row_);
  66. }
  67.  
  68. int32 count_row = 0;
  69. for (size_t i = 0; i < row_ * column_; ++i) {
  70. if (!(count_row % column_)) {
  71. count_row += 1;
  72. }
  73. buffer[i % column_].push_back(data_[i]);
  74. }
  75.  
  76. cout << "This is buffer:\n";
  77. for (auto i : buffer) {
  78. for (auto j : i) {
  79. cout << j << ' ';
  80. }
  81. cout << '\n';
  82. }
  83. cout << '\n';
  84. cout << "This is *this before transpose():\n" << *this << "\n\n";
  85.  
  86. swap(row_, column_);
  87. int32 paste_in = 0;
  88. data_.resize(row_);
  89. for (size_t i = 0; i < row_; ++i) {
  90. data_.reserve(column_);
  91. for (size_t j = 0; j < column_; ++j) {
  92. data_[paste_in] = buffer[i][j];
  93. ++paste_in;
  94. }
  95. }
  96.  
  97. cout << "This is *this after transpose():\n" << *this << "\n\n";
  98.  
  99.  
  100.  
  101. return *this;
  102. }
  103.  
  104. const Matrix transposed() const {
  105. Matrix<T> new_matrix = *this;
  106. new_matrix.transpose();
  107. return new_matrix;
  108. }
  109. };
  110.  
  111. template <typename T>
  112. ostream& operator<<(ostream& out, const Matrix<T>& m) {
  113. auto row = m.size().first;
  114. auto column = m.size().second;
  115. out << m[0];
  116. for (size_t i = 1; i < column; ++i) {
  117. out << "\t" << m[i];
  118. }
  119. for (size_t i = column; i < row * column; ++i) {
  120. if (!(i % column)) {
  121. out << "\n" << m[i];
  122. } else {
  123. out << "\t" << m[i];
  124. }
  125. }
  126. return out;
  127. }
  128.  
  129.  
  130.  
  131. int main() {
  132. vector<vector<int32>> v = {{0, 1, 2, 3},
  133. {4, 5, 6, 7},
  134. {8, 9, 10, 11}};
  135. vector<vector<int32>> w = {{1}};
  136. vector<vector<int32>> u = {{1, 2, 3, 4, 5, 6}, {7, 8, 9, 10, 11, 12}, {-1, -2, -3, -4, -5, -6}};
  137. Matrix<int32> mat1(w);
  138. Matrix<int32> mat2(w);
  139. w = {{0, -1},
  140. {-6, 2},
  141. {1, 7}};
  142. mat1.transpose();
  143. //cout << mat1.transpose() << "\n\n";
  144. //Matrix<int32> mat3 = mat1.transposed();
  145. //cout << mat1.transposed() << "\n\n" << mat3 << "\n\n" << mat1.transpose() << "\n\n" << mat1 << "\n\n";
  146. return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement