28#ifndef _SRC_COMMON_CPP_MATHS_MMATRIX_HH_
29#define _SRC_COMMON_CPP_MATHS_MMATRIX_HH_
61 template <
class Tmplt>
80 MMatrix(
size_t nrows,
size_t ncols, Tmplt* data_beginning);
88 MMatrix(
size_t nrows,
size_t ncols, Tmplt value);
95 MMatrix(
size_t nrows,
size_t ncols);
152 MMatrix<Tmplt> sub(
size_t min_row,
size_t max_row,
size_t min_col,
size_t max_col)
const;
174 template <
class Tmplt2>
207 template <
class Tmplt>
210 template <
class Tmplt>
212 template <
class Tmplt>
214 template <
class Tmplt>
216 template <
class Tmplt>
219 template <
class Tmplt>
221 template <
class Tmplt>
223 template <
class Tmplt>
226 template <
class Tmplt>
228 template <
class Tmplt>
236 template <
class Tmplt>
238 template <
class Tmplt>
254 if (_matrix)
return ((
gsl_matrix*)_matrix)->size1;
264 if (_matrix)
return ((
gsl_matrix*)_matrix)->size2;
311 template <
class Tmplt>
313 for (
size_t i = 1; i <= m1.
num_row(); i++)
314 for (
size_t j = 1; j <= m1.
num_col(); j++)
315 m1(i, j) = -1. * m1(i, j);
319 template <
class Tmplt>
324 template <
class Tmplt>
329 template <
class Tmplt>
334 template <
class Tmplt>
338 template <
class Tmplt>
343 template <
class Tmplt>
349 template <
class Tmplt>
353 template <
class Tmplt>
376 template <
class Tmplt>
379 for (
size_t i = 1; i <= lhs.
num_row(); i++)
380 for (
size_t j = 1; j <= lhs.
num_col(); j++)
381 if (lhs(i, j) != rhs(i, j))
return false;
385 template <
class Tmplt>
387 return !(lhs == rhs);
391 template <
class Tmplt>
392 std::ostream&
operator<<(std::ostream& out, MMatrix<Tmplt>);
395 template <
class Tmplt>
399 "MMatrix::get_matrix",
"Attempt to access uninitialised matrix"));
403 template <
class Tmplt>
407 "MMatrix::get_matrix",
"Attempt to access uninitialised matrix"));
void gsl_blas_zgemv(CBLAS_TRANSPOSE TransA, gsl_complex alpha, const gsl_matrix_complex *A, const gsl_vector_complex *x, gsl_complex beta, gsl_vector_complex *y)
Complex matrix-vector multiply and accumulate.
void gsl_blas_dgemv(CBLAS_TRANSPOSE TransA, double alpha, const gsl_matrix *A, const gsl_vector *x, double beta, gsl_vector *y)
Real matrix-vector multiply and accumulate.
void gsl_matrix_complex_scale(gsl_matrix_complex *m, gsl_complex x)
Scale a complex matrix in-place.
void gsl_matrix_scale(gsl_matrix *m, double x)
Scale a matrix in-place.
double * gsl_matrix_ptr(gsl_matrix *m, size_t i, size_t j)
Return pointer to element in a real matrix.
void gsl_matrix_complex_add(gsl_matrix_complex *a, const gsl_matrix_complex *b)
Add another complex matrix in-place.
gsl_complex * gsl_matrix_complex_ptr(gsl_matrix_complex *m, size_t i, size_t j)
Return pointer to element in a complex matrix.
void gsl_matrix_add(gsl_matrix *a, const gsl_matrix *b)
Add another matrix in-place.
void build_matrix(size_t i, size_t j, Tmplt *temp)
friend MVector< double > operator*(MMatrix< double > m, MVector< double > v)
void invert()
turns this matrix into its inverse
static gsl_matrix * get_matrix(const MMatrix< double > &m)
MVector< Tmplt > get_mvector(size_t column) const
size_t num_col() const
returns number of columns in the matrix
MVector< m_complex > eigenvalues() const
returns a vector of eigenvalues. Throws an exception if either this matrix is not square or the eigen...
void build_matrix(size_t i, size_t j)
MMatrix< Tmplt > & operator=(const MMatrix< Tmplt > &mm)
friend MVector< m_complex > operator*(MMatrix< m_complex > m, MVector< m_complex > v)
MMatrix(const MMatrix< Tmplt > &mv)
Copy constructor makes a deep copy of mv.
friend MMatrix< double > & operator*=(MMatrix< double > &m, double d)
MMatrix< Tmplt > T() const
returns matrix transpose T (such that M(i,j) = T(j,i))
Tmplt & operator()(size_t row, size_t column)
size_t num_row() const
returns number of rows in the matrix
std::pair< MVector< m_complex >, MMatrix< m_complex > > eigenvectors() const
MMatrix< Tmplt > inverse() const
returns matrix inverse leaving this matrix unchanged
friend MMatrix< double > & operator+=(MMatrix< double > &m1, const MMatrix< double > &m2)
MMatrix< Tmplt > sub(size_t min_row, size_t max_row, size_t min_col, size_t max_col) const
friend MMatrix< m_complex > & operator*=(MMatrix< m_complex > &m, m_complex c)
static MMatrix< Tmplt > Diagonal(size_t i, Tmplt diag_value, Tmplt off_diag_value)
Construct a square matrix filling on and off diagonal values.
friend MMatrix< m_complex > & operator+=(MMatrix< m_complex > &m1, const MMatrix< m_complex > &m2)
Tmplt determinant() const
returns matrix determinant; throws an exception if matrix is not square
static gsl_matrix_complex * get_matrix(const MMatrix< m_complex > &m)
friend MMatrix< Tmplt2 > operator+(MMatrix< Tmplt2 > m1, const MMatrix< Tmplt2 > m2)
MMatrix()
default constructor makes an empty MMatrix of size (0,0)
const Tmplt & operator()(size_t row, size_t column) const
Tmplt trace() const
returns sum of terms with row == column, even if matrix is not square
MMatrix< Tmplt > operator/(MMatrix< Tmplt >, Tmplt)
m_complex m_complex_build(double r, double i)
Mesh::Iterator operator+(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
Mesh::Iterator operator-(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
bool operator==(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
MMatrix< m_complex > complex(MMatrix< double > real)
bool operator!=(const Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
Mesh::Iterator & operator+=(Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
MVector< m_complex > operator*(MMatrix< m_complex > m, MVector< m_complex > v)
template std::istream & operator>>(std::istream &in, MMatrix< double > &mat)
MMatrix< double > re(MMatrix< m_complex > mc)
std::ostream & operator<<(std::ostream &out, const Mesh::Iterator &it)
MMatrix< Tmplt > inline & operator/=(MMatrix< Tmplt > &m, Tmplt t)
MMatrix< double > & operator*=(MMatrix< double > &m1, MMatrix< double > m2)
MMatrix< double > im(MMatrix< m_complex > mc)
Mesh::Iterator & operator-=(Mesh::Iterator &lhs, const Mesh::Iterator &rhs)
Complex number stored as .
Dense complex matrix in row-major storage.
Dense real matrix in row-major storage.
Dense complex vector with stride.
Dense real vector with stride.