// Author: Douglas Wilhelm Harder // Copyright (c) 2009 by Douglas Wilhelm Harder. All rights reserved. #ifdef CA_UWATERLOO_ALUMNI_DWHARDER_SPARSE_SYSTEMS template class Matrix { private: int capacity; double diagonal[( M < N ) ? M : N]; int row_index[M + 1]; int *column_index; double *off_diagonal; static int const minMN; static int count_nonzero_entries( Matrix const &, Matrix const &, bool ); void increase_capacity( int ); public: Matrix( double = 0.0, int = 0 ); Matrix( Matrix const & ); ~Matrix(); Matrix &operator=( Matrix const & ); double operator()( int, int ) const; // Special Constructors // ... // Matrix Functions double norm() const; double norm( int ) const; double trace() const; Matrix operator- () const; bool validate() const; // Matrix Mechanics void set( int, int, double ); void set_symmetric( int, int, double ); void clear( int, int ); void clear(); void resize( int = 0 ); // Matrix-Matrix Operations Matrix &operator+=( Matrix const & ); Matrix &operator-=( Matrix const & ); // Matrix-Vector Operations template Matrix &operator+=( Vector const & ); template Matrix &operator-=( Vector const & ); // Matrix-Scalar Operations Matrix &operator+=( double ); Matrix &operator-=( double ); Matrix &operator*=( double ); Matrix &operator/=( double ); // Matrix Queries bool is_lower_triangular() const; bool is_upper_triangular() const; bool is_strict_lower_triangular() const; bool is_strict_upper_triangular() const; bool is_diagonal() const; bool is_symmetric() const; bool is_antisymmetric() const; // Matrix Streaming/Printing void details() const; void matlab( std::string const & ) const; void matlab_dense( std::string const & ) const; template friend Matrix operator+( Matrix const &, Matrix const & ); // Matrix Functions template friend Matrix transpose( Matrix const & ); // Matrix-Vector Operators template friend Vector operator*( Vector const &, Matrix const & ); template friend Vector operator*( Matrix const &, Vector const & ); template friend Vector &operator*=( Matrix const &, Vector & ); template friend Vector operator*=( Vector &, Matrix const & ); // Matrix-Scalar Functions template friend Matrix operator-( double, Matrix const & ); // Matrix Solvers template friend Vector jacobi( Matrix const &, Vector const &, int, double ); template friend Vector gauss_seidel( Matrix const &, Vector const &, int, double ); template friend Vector diagonal_solve( Matrix const &, Vector const & ); template friend Vector backward_substitution( Matrix const &, Vector const &, bool ); template friend Vector forward_substitution( Matrix const &, Vector const &, bool ); template friend Vector matrix_vector_product( Matrix const &, Vector const &, Product ); template friend Vector vector_matrix_product( Vector const &, Matrix const &, Product ); // Matrix Streaming/Printing template friend std::ostream &operator<<( std::ostream &, Matrix const & ); }; template int const Matrix::minMN = ( M < N ) ? M : N; #include "matrix_mechanics.cpp" #include "matrix_functions.cpp" #include "matrix_private_functions.cpp" #include "matrix_queries.cpp" #include "matrix_solvers.cpp" #include "matrix_scalar_operations.cpp" #include "matrix_vector_operations.cpp" #include "matrix_matrix_operations.cpp" #include "matrix_streaming.cpp" #include "projection_methods.cpp" #endif