#pragma once #include #include #include // Class declarations template class vec; template class matrix; enum NORM { infinity, one, two }; // Class definitions template class matrix { public: matrix( double constant = 0.0 ); matrix( std::initializer_list> init ); matrix( std::initializer_list> init ); matrix( std::initializer_list init ); double &operator()( unsigned int i, unsigned int j ); double const &operator()( unsigned int i, unsigned int j ) const; std::string to_string() const; // Scalar multiplication matrix operator *( double s ) const; matrix &operator *=( double s ); matrix operator /( double s ) const; matrix &operator /=( double s ); // Matrix addition matrix operator+( matrix const &A ) const; matrix &operator+=( matrix const &A ); matrix operator-( matrix const &A ) const; matrix &operator-=( matrix const &A ); // Scalar addition matrix operator+( double s ) const; matrix &operator+=( double s ); matrix operator-( double s ) const; matrix &operator-=( double s ); // Unary operators matrix operator +() const; matrix operator -() const; vec operator*( vec const &v ) const; matrix operator*() const; matrix operator*=( matrix const &A ) const; unsigned int rank( double tolerance = 1e-12 ) const; double det( double tolerance = 1e-12 ) const; double tr() const; matrix inv( double tolerance = 1e-12 ) const; std::vector> solve( vec const &v, double tolerance = 1e-12 ) const; private: double entries_[m][n]; void throw_matrix_exception( unsigned int i, unsigned int j ) const; template friend matrix operator*( matrix const &B, matrix const &A ); }; template matrix transpose( matrix const &A ); template matrix operator*( matrix const &B, matrix const &A ); template double det( matrix const & A ); template double tr( matrix const & A ); template matrix inv( matrix const & A ); template class vec { public: vec( double constant = 0.0 ); vec( std::initializer_list init ); double &operator()( unsigned int k ); double const &operator()( unsigned int k ) const; std::string to_string() const; // Scalar multiplication vec operator *( double s ) const; vec &operator *=( double s ); vec operator /( double s ) const; vec &operator /=( double s ); // Vector addition vec operator+( vec const &v ) const; vec &operator+=( vec const &v ); vec operator-( vec const &v ) const; vec &operator-=( vec const &v ); // Scalar addition vec operator+( double s ) const; vec &operator+=( double s ); vec operator-( double s ) const; vec &operator-=( double s ); // Unary operators vec operator +() const; vec operator -() const; // Inner product double operator *( vec const &v ) const; double norm() const; double norm( NORM flavor ) const; vec &project( vec const &v ); private: double entries_[n]; void throw_vector_exception( unsigned int k ) const; }; template double norm( vec const &v ); template unsigned int rank( matrix const &A ); template vec operator *( double s, vec const &v ); template vec operator /( double s, vec const &v ); template std::ostream &operator<<( std::ostream &out, vec const &rhs ); template std::ostream &operator<<( std::ostream &out, matrix const &rhs ); #include "vec.tpp" #include "matrix.tpp"