#include /* needed for std::size_t */ #include /* needed for printf */ #include /* needed for assert */ enum class StorageOrder {ColMajor, RowMajor}; template struct Matrix { const std::size_t m; /* number of rows */ const std::size_t n; /* number of columns */ const std::size_t incRow; const std::size_t incCol; T* data; typedef T Element; Matrix(std::size_t m, std::size_t n, StorageOrder order) : m(m), n(n), incRow(order == StorageOrder::ColMajor? 1: n), incCol(order == StorageOrder::RowMajor? 1: m), data(new T[m*n]) { } ~Matrix() { delete[] data; } const T& operator()(std::size_t i, std::size_t j) const { assert(i < m && j < n); return data[i*incRow + j*incCol]; } T& operator()(std::size_t i, std::size_t j) { assert(i < m && j < n); return data[i*incRow + j*incCol]; } }; template struct MatrixView { const std::size_t m; /* number of rows */ const std::size_t n; /* number of columns */ const std::size_t incRow; const std::size_t incCol; T* data; typedef T Element; MatrixView(std::size_t m, std::size_t n, T* data, std::size_t incRow, std::size_t incCol) : m(m), n(n), incRow(incRow), incCol(incCol), data(data) { } MatrixView(const MatrixView& other) : m(other.m), n(other.n), incRow(other.incRow), incCol(other.incCol), data(other.data) { } const T& operator()(std::size_t i, std::size_t j) const { assert(i < m && j < n); return data[i*incRow + j*incCol]; } T& operator()(std::size_t i, std::size_t j) { assert(i < m && j < n); return data[i*incRow + j*incCol]; } }; template void init_matrix(Matrix& A) { for (std::size_t i = 0; i < A.m; ++i) { for (std::size_t j = 0; j < A.n; ++j) { A(i, j) = j * A.n + i + 1; } } } void print_value(long double value) { std::printf(" %4.1Lf", value); } void print_value(double value) { std::printf(" %4.1lf", value); } void print_value(float value) { std::printf(" %4.1f", value); } template void print_matrix(const Matrix& A) { for (std::size_t i = 0; i < A.m; ++i) { std::printf(" "); for (std::size_t j = 0; j < A.n; ++j) { print_value(A(i, j)); } std::printf("\n"); } } template MatrixView create_view(Matrix& A, std::size_t i, std::size_t j, std::size_t m, std::size_t n) { assert(i + m <= A.m && j + n <= A.n); return MatrixView(m, n, &A(i, j), A.incRow, A.incCol); } int main() { Matrix A(1, 1, StorageOrder::ColMajor); std::printf("A =\n"); print_matrix(A); }