#include #include #include "matrix.h" using namespace std; template matrix::matrix(std::valarray&& v_, std::size_t m_, std::size_t n_) : v(v_), m(m_), n(n_) { if (v.size() != m * n) throw invalid_argument("valarray of wrong size"); } template matrix::matrix(size_t m_, size_t n_, T val_) : v(val_, m_ * n_),m(m_),n(n_) {} template size_t matrix::rows() const { return m; } template size_t matrix::columns() const { return n; } template matrix::matrix_slice::matrix_slice (valarray& v_, size_t start, size_t size, size_t stride) : slice(start, size, stride), v(v_) {} template T& matrix::matrix_slice::operator[](size_t i) { return v[start() + i*stride()]; } template T matrix::matrix_slice::operator[](size_t i) const { return v[start() + i*stride()]; } template matrix::matrix_slice::operator valarray() const { valarray v(size()); for (size_t i = 0; i < size(); i++) v[i] = (*this)[i]; return v; } template typename matrix::matrix_slice matrix::operator[](size_t i) { return row(i); } template typename matrix::matrix_slice matrix::row(size_t i) { return matrix::matrix_slice{v, i*n, n, 1}; } template typename matrix::matrix_slice matrix::column(size_t j) { return matrix::matrix_slice{v, j, m, n}; } template matrix::operator valarray() const { return v; } template T* matrix::begin() { return std::begin(v); } template T* matrix::end() { return std::end(v); } template class matrix;