#include #include #include template class Matrix { //HEAD using MatrixRow = Matrix<1, Columns, DataType>; using MatrixColumn = Matrix; MatrixRow d_matrix[Rows]; //= public: Matrix(); Matrix(std::istream &str); MatrixRow &operator[](size_t idx); MatrixRow const &operator[](size_t idx) const; MatrixRow columnMarginals() const; MatrixColumn rowMarginals() const; DataType sum() const; }; //MATRIXROW template // no default allowed class Matrix<1, Columns, DataType> //= { //ROWDATA DataType d_column[Columns]; //= public: Matrix(); template Matrix(Matrix const &matrix); DataType &operator[](size_t idx); DataType const &operator[](size_t idx) const; }; //MATRIXCOLUMN template class Matrix //= { DataType d_row[Rows]; public: Matrix(); template Matrix(Matrix const &matrix); DataType &operator[](size_t idx); DataType const &operator[](size_t idx) const; DataType sum(); }; //MATRIX1X1 template class Matrix<1, 1, DataType> //= { DataType d_cell; public: Matrix(); template Matrix(Matrix const &matrix); template Matrix(Matrix const &matrix); operator DataType &(); DataType &get(); operator DataType const &() const; DataType const &get() const; }; //MARGINALS template Matrix<1, Columns, DataType> Matrix::columnMarginals() const { return MatrixRow(*this); } template Matrix Matrix::rowMarginals() const { return MatrixColumn(*this); } template DataType Matrix::sum() const { return rowMarginals().sum(); } //= //CONSTRUCTORS template Matrix::Matrix() { std::fill(d_matrix, d_matrix + Rows, MatrixRow()); } template Matrix::Matrix(std::istream &str) { for (size_t row = 0; row < Rows; row++) for (size_t col = 0; col < Columns; col++) str >> d_matrix[row][col]; } //= //OPERATORINDEX template Matrix<1, Columns, DataType> &Matrix::operator[](size_t idx) { return d_matrix[idx]; } //= template Matrix<1, Columns, DataType> const &Matrix::operator[](size_t idx) const { return d_matrix[idx]; } //ROWCONS1 template Matrix<1, Columns, DataType>::Matrix() { std::fill(d_column, d_column + Columns, DataType()); } //= //ROWCONS2 template template Matrix<1, Columns, DataType>::Matrix( Matrix const &matrix) { std::fill(d_column, d_column + Columns, DataType()); for (size_t col = 0; col < Columns; col++) for (size_t row = 0; row < Rows; row++) d_column[col] += matrix[row][col]; } //= //ROWOPERATORINDEX template DataType &Matrix<1, Columns, DataType>::operator[](size_t idx) { return d_column[idx]; } //= template DataType const &Matrix<1, Columns, DataType>::operator[](size_t idx) const { return d_column[idx]; } template Matrix::Matrix() { std::fill(d_row, d_row + Rows, DataType()); } template template Matrix::Matrix( Matrix const &matrix) { for (size_t row = 0; row < Rows; row++) d_row[row] = std::accumulate ( &matrix[row][0], &matrix[row][Columns], DataType() ); } template DataType &Matrix::operator[](size_t idx) { return d_row[idx]; } template DataType const &Matrix::operator[](size_t idx) const { return d_row[idx]; } //SUMCOLUMN template DataType Matrix::sum() { return std::accumulate(d_row, d_row + Rows, DataType()); } //= template Matrix<1, 1, DataType>::Matrix() : d_cell(DataType()) {} //1X1CONS template template Matrix<1, 1, DataType>::Matrix( Matrix const &matrix) : d_cell(matrix.rowMarginals().sum()) {} template template Matrix<1, 1, DataType>::Matrix(Matrix const &matrix) : d_cell(matrix.sum()) {} //= //ACCESSORS template Matrix<1, 1, DataType>::operator DataType &() { return d_cell; } template DataType &Matrix<1, 1, DataType>::get() { return d_cell; } //= template Matrix<1, 1, DataType>::operator DataType const &() const { return d_cell; } template DataType const &Matrix<1, 1, DataType>::get() const { return d_cell; }