/* This file is part of MAUS: http:// micewww.pp.rl.ac.uk:8080/projects/maus
*
* MAUS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MAUS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MAUS. If not, see .
*/
/* Author: Peter Lane
*/
#ifndef COMMON_CPP_MATHS_SYMMETRIC_MATRIX_HH
#define COMMON_CPP_MATHS_SYMMETRIC_MATRIX_HH
#include
#include
#include
#include "TMatrixDSym.h"
#include "Utils/Exception.hh"
#include "Maths/Complex.hh"
#include "Maths/Matrix.hh"
#include "Maths/Vector.hh"
namespace CLHEP {
class HepSymMatrix;
}
namespace MAUS {
// *************************
// Forward Declarations
// *************************
class Matrix;
class HermitianMatrix;
class SymmetricMatrix;
class Vector;
// *************************
// Conversion Functions
// *************************
/** @brief returns the inverse of a matrix
*/
SymmetricMatrix inverse(const SymmetricMatrix& matrix);
namespace CLHEP {
/** @brief Creates a CLHEP::HepMatrix from a MAUS::Matrix. This function is
* meant to look like a copy constructor for the HepMatrix class, but
* it is a free function in the namespace MAUS::CLHEP.
*
*/
::CLHEP::HepSymMatrix HepSymMatrix(const SymmetricMatrix& matrix);
}
// *************************
// Eigensystem Functions
// *************************
/** @brief returns a vector of eigenvalues. Throws an exception if either this
* matrix is not square or the eigenvalues could not be found (e.g.
* singular matrix or whatever).
*/
Vector eigenvalues(const SymmetricMatrix& matrix);
/** @brief returns a vector of std::pair containing a vector of eigenvalues
* and a matrix of eigenvectors. Throws an exception if either this
* matrix is not square or the eigenvalues could not be found (e.g.
* singular matrix or whatever).
*/
std::pair, Matrix > eigensystem(
const SymmetricMatrix& matrix);
// *************************
// Unitary Operators
// *************************
MAUS::SymmetricMatrix operator-(const SymmetricMatrix& matrix);
// *************************
// Scalar Operators
// *************************
MAUS::SymmetricMatrix operator*(
const double& value,
const SymmetricMatrix& matrix);
/** @class SymmetricMatrix extends Matrix by enforcing symmetric arrangements of
* elements. All elements are stored despite the redundent nature of
* symmetric matrices. This is so that base class functions will work
* properly. They will just return an ordinary Matrix object.
*/
class SymmetricMatrix : public Matrix {
public:
/** @brief default constructor makes an empty SymmetricMatrix of size 0
*/
SymmetricMatrix();
/** @brief Copy constructor
*/
SymmetricMatrix(const SymmetricMatrix& original_instance);
/** @brief Base class copy constructor
*/
explicit SymmetricMatrix(const Matrix& matrix);
/** @brief Copy constructor for CLHEP::HepSymMatrix
*/
explicit SymmetricMatrix(const ::CLHEP::HepSymMatrix& hep_matrix);
/** @brief TMatrixDSym copy constructor. This copies only the first 6x6
* block elements of the TMatrixDSym object.
*/
explicit SymmetricMatrix(const TMatrixDSym& root_sym_matrix);
/** @brief Construct a matrix and fill all fields with 0
*
* @params size number of rows/columns
*/
explicit SymmetricMatrix(const size_t size);
/** @brief Construct a matrix and fill with identical data
*
* @params size number of rows/columns
* @params data variable to be copied into all items in the matrix
*/
SymmetricMatrix(const size_t size, const double& value);
/** @brief Construct a matrix and fill with data from an array
*
* @params size number of rows/columns
* @params data pointer to the start of a memory block of size
* size^2 with data laid out . Only the lower
* triangle of data is used to easily ensure element symmetry.
* Note: SymmetricMatrix does not take ownership of memory in data.
*/
SymmetricMatrix(const size_t size, double const * const data);
// *************************
// Indexing Operators
// *************************
double operator()(const size_t row, const size_t column) const;
// *************************
// Size Functions
// *************************
/** @brief returns number of rows/columns in the matrix
*/
const size_t size() const;
// *************************
// Element Set Functions
// *************************
/** @brief Sets both (row,column) and (column,row) to value.
*/
void set(size_t row, size_t column, double value);
// *************************
// Assignment Operators
// *************************
SymmetricMatrix& operator =(
const SymmetricMatrix& rhs);
SymmetricMatrix& operator+=(
const SymmetricMatrix& rhs);
SymmetricMatrix& operator-=(
const SymmetricMatrix& rhs);
SymmetricMatrix& operator*=(const double& rhs);
SymmetricMatrix& operator/=(const double& rhs);
// *************************
// Algebraic Operators
// *************************
const SymmetricMatrix operator+(
const SymmetricMatrix& rhs) const;
const SymmetricMatrix operator-(
const SymmetricMatrix& rhs) const;
const SymmetricMatrix operator*(const double& rhs) const;
const SymmetricMatrix operator/(const double& rhs) const;
// *************************
// Befriending
// *************************
// These use special low-level gsl functions for symmetric matricies
friend Vector eigenvalues(const SymmetricMatrix& matrix);
friend std::pair, Matrix >
eigensystem(const SymmetricMatrix& matrix);
protected:
// build the matrix with size^2 elements initialised to zero by default
void build_matrix(const size_t size, const bool initialize = true);
// build the matrix with size^2 elements initialised to array data in
// row major order
void build_matrix(const size_t size, double const * const data);
};
} // namespace MAUS
#endif