// Matrix.h #ifndef MATRIX_H #define MATRIX_H #include using namespace std; template class Matrix { private: size_t n, m, len; T *a; public: Matrix(size_t n, size_t m) : n(n), m(m), len(n * m), a(new T[len]) { for(size_t i(0); i < len; ++i) a[i] = 0; } ~Matrix() { if(!a) return; delete[] a; a = nullptr; } T *operator [](size_t i) { return (i >= 0 && i < n && a) ? i * m + a : nullptr; } T const *operator [](size_t i) const { return (i >= 0 && i < n && a) ? i * m + a : nullptr; } T get_trace() const { T trace(0); if(!a) return trace; size_t c = n < m ? n : m; for(size_t i(0); i < c; ++i) trace += (*this)[i][i]; return trace; } size_t get_n() const { return n; } size_t get_m() const { return m; } void init(T (*generator)()) { for(size_t i(0); i < len; ++i) a[i] = generator(); } }; template ostream &operator <<(ostream &out, Matrix const &matrix) { size_t n(matrix.get_n()), m(matrix.get_m()), i(0), j(0); T const *row(matrix[i]); out << "[\r\n [ " << row[j]; for(++j; j < m; ++j) out << ", " << row[j]; out << " ]"; for(++i; i < n; ++i) { row = matrix[i]; out << ",\r\n [ " << row[j = 0]; for(++j; j < m; ++j) out << ", " << row[j]; out << " ]"; } out << "\r\n]"; return out; } #endif