Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <array>
  4.  
  5. #define _MATRIX matrix_t<T, R, C>
  6.  
  7. template<typename T, int R, int C> class matrix_t {
  8. std::array<std::array<T, C>, R> _matrix;
  9. T _rows = R,
  10. _columns = C;
  11.  
  12. public:
  13. matrix_t(const int i = 0) {
  14. for (std::array<T, C>& a: _matrix)
  15. a.fill(i);
  16. }
  17.  
  18. template <typename A, typename... B> matrix_t(A _a, B... _b) {
  19. int _r = 0,
  20. _c = 0;
  21. for (const A& i: { _a, _b... }) {
  22. _matrix[_r][_c] = i;
  23. _c += 1;
  24. if (_c == _columns) {
  25. _c = 0;
  26. _r += 1;
  27. }
  28. }
  29. }
  30.  
  31. auto rows() const {
  32. return _rows;
  33. }
  34.  
  35. auto columns() const {
  36. return _columns;
  37. }
  38.  
  39. auto size() const {
  40. return _rows * _columns;
  41. }
  42.  
  43. auto get(const int& x, const int& y) const {
  44. return _matrix[x][y];
  45. }
  46.  
  47. auto set(const int& x, const int& y, const T& n) {
  48. _matrix[x][y] = n;
  49. }
  50.  
  51. auto to_string() {
  52. std::string out = "[";
  53. for (const auto& a: _matrix)
  54. for (const auto& v: a)
  55. out += std::to_string(v) + ", ";
  56. return out.substr(0, out.length() - 2) + "]";
  57. }
  58.  
  59. friend std::ostream& operator <<(std::ostream& os, const _MATRIX& m) {
  60. std::array<int, R> lengths;
  61. lengths.fill(0);
  62.  
  63. for (int i = 0; i < R; ++i) {
  64. for (int j = 0; j < C; ++j) {
  65. int t = std::to_string(m._matrix[j][i]).length();
  66. if (t > lengths[i])
  67. lengths[i] = t;
  68. }
  69. }
  70.  
  71. for (int i = 0; i < R; ++i) {
  72. os << "[";
  73. for (int j = 0; j < C; ++j) {
  74. int buf_len = lengths[j] - std::to_string(m._matrix[i][j]).length() + 1;
  75. os << m._matrix[i][j];
  76. if (j + 1 != C)
  77. os << "," << std::string(buf_len, ' ');
  78. else
  79. if (buf_len - 1 > 0)
  80. os << std::string(buf_len - 1, ' ');
  81. }
  82. os << "]";
  83. if (i + 1 != C)
  84. os << std::endl;
  85. }
  86. return os;
  87. }
  88.  
  89. friend _MATRIX operator +(const _MATRIX& m1, const _MATRIX& m2) {
  90. _MATRIX ret(0);
  91. for (int i = 0; i < R; ++i)
  92. for (int j = 0; j < C; ++j)
  93. ret._matrix[i][j] = m1._matrix[i][j] + m2._matrix[i][j];
  94. return ret;
  95. }
  96.  
  97. friend _MATRIX operator -(const _MATRIX& m1, const _MATRIX& m2) {
  98. _MATRIX ret(0);
  99. for (int i = 0; i < R; ++i)
  100. for (int j = 0; j < C; ++j)
  101. ret._matrix[i][j] = m1._matrix[i][j] - m2._matrix[i][j];
  102. return ret;
  103. }
  104.  
  105. _MATRIX operator +=(const _MATRIX& m) {
  106. return *this + m;
  107. }
  108.  
  109. _MATRIX operator -=(const _MATRIX& m) {
  110. return *this - m;
  111. }
  112.  
  113. std::array<T, C>& operator [](const int& i) {
  114. return this->_matrix[i];
  115. }
  116. };
  117.  
  118. template<typename T> class matrix_2x2_t: public matrix_t<T, 2, 2> {
  119. public:
  120. };
  121.  
  122. typedef matrix_2x2_t<signed int> matrix_2x2i;
  123. typedef matrix_2x2_t<unsigned int> matrix_2x2ui;
  124. typedef matrix_2x2_t<float> matrix_2x2f;
  125. typedef matrix_2x2_t<double> matrix_2x2d;
  126.  
  127.  
  128. template<typename T> class matrix_3x3_t: public matrix_t<T, 3, 3> {
  129. public:
  130. };
  131.  
  132. typedef matrix_3x3_t<signed int> matrix_3x3i;
  133. typedef matrix_3x3_t<unsigned int> matrix_3x3ui;
  134. typedef matrix_3x3_t<float> matrix_3x3f;
  135. typedef matrix_3x3_t<double> matrix_3x3d;
  136.  
  137.  
  138. template<typename T> class matrix_4x4_t: public matrix_t<T, 4, 4> {
  139. public:
  140. };
  141.  
  142. typedef matrix_4x4_t<signed int> matrix_4x4i;
  143. typedef matrix_4x4_t<unsigned int> matrix_4x4ui;
  144. typedef matrix_4x4_t<float> matrix_4x4f;
  145. typedef matrix_4x4_t<double> matrix_4x4d;
  146.  
  147. typedef matrix_t<int, 2, 2> matrix2x2i;
  148. typedef matrix_t<int, 3, 3> matrix3x3i;
  149.  
  150. auto main() -> int {
  151. matrix3x3i m1 = {0, 12, 2,
  152. 3, 444, 52,
  153. 63, 7, 8};
  154. std::cout << "m1" << std::endl;
  155. std::cout << m1.rows() << "x" << m1.columns() << " (" << m1.size() << ")" << std::endl;
  156. std::cout << m1.to_string() << std::endl;
  157. std::cout << m1 << std::endl << std::endl;
  158.  
  159. matrix3x3i m2 = {-6, 4, 8,
  160. 3, 0, 1,
  161. 2, 2, -4};
  162. std::cout << "m2" << std::endl;
  163. std::cout << m2.rows() << "x" << m1.columns() << " (" << m2.size() << ")" << std::endl;
  164. std::cout << m2.to_string() << std::endl;
  165. std::cout << m2 << std::endl << std::endl;
  166.  
  167. std::cout << m1.to_string() << " - " << m2.to_string() << " = " << std::endl;
  168. matrix3x3i m3 = m1 - m2;
  169. std::cout << m3 << std::endl << std::endl;
  170.  
  171. m1 += m2;
  172. std::cout << "m1 (m1 += m2)" << std::endl;
  173. std::cout << m1 << std::endl << std::endl;
  174.  
  175. m1 -= m2;
  176. std::cout << "m1 (m1 -= m2)" << std::endl;
  177. std::cout << m1 << std::endl << std::endl;
  178.  
  179. // matrix3x3i m4 = m1 * m2;
  180. // std::cout << "m4 (m1 * m2)" << std::endl;
  181. // std::cout << m1 << std::endl;
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement