CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
LinearAlgebra

Detailed Description

Linear algebra routines.

Namespaces

 CASM::normal_form_impl
 

Functions

void CASM::get_Hermitian (Eigen::MatrixXcd &original_mat, Eigen::MatrixXcd &hermitian_mat, Eigen::MatrixXcd &antihermitian_mat)
 
bool CASM::is_Hermitian (Eigen::MatrixXcd &mat)
 
void CASM::poly_fit (Eigen::VectorXcd &xvec, Eigen::VectorXcd &yvec, Eigen::VectorXcd &coeffs, int degree)
 
std::pair< Eigen::MatrixXi,
Eigen::MatrixXi > 
CASM::hermite_normal_form (const Eigen::MatrixXi &M)
 Return the hermite normal form, M == H*V. More...
 
double CASM::angle (const Eigen::Ref< const Eigen::Vector3d > &a, const Eigen::Ref< const Eigen::Vector3d > &b)
 Get angle, in radians, between two vectors on range [0,pi]. More...
 
double CASM::signed_angle (const Eigen::Ref< const Eigen::Vector3d > &a, const Eigen::Ref< const Eigen::Vector3d > &b, const Eigen::Ref< const Eigen::Vector3d > &pos_ref)
 signed angle, in radians, between -pi and pi that describe separation in direction of two vectors More...
 
Eigen::MatrixXd CASM::pretty (const Eigen::MatrixXd &M, double tol)
 Round entries that are within tol of being integer to that integer value. More...
 
template<typename Derived >
Derived::Scalar CASM::triple_prod (const Derived &vec0, const Derived &vec1, const Derived &vec2)
 
template<typename Derived >
bool CASM::is_integer (const Eigen::MatrixBase< Derived > &M, double tol)
 Check if Eigen::Matrix is integer. More...
 
template<typename Derived >
bool CASM::is_unimodular (const Eigen::MatrixBase< Derived > &M, double tol)
 Check if Eigen::Matrix is unimodular. More...
 
template<typename Derived >
bool CASM::is_diagonal (const Eigen::MatrixBase< Derived > &M, double tol=TOL)
 Check if Eigen::Matrix is diagonal. More...
 
template<typename Derived >
Eigen::CwiseUnaryOp< decltype(std::ptr_fun(boost::math::iround
< typename Derived::Scalar >
)), const Derived > 
CASM::iround (const Eigen::MatrixBase< Derived > &val)
 Round Eigen::MatrixXd to Eigen::MatrixXi. More...
 
template<typename Derived >
Eigen::CwiseUnaryOp< decltype(std::ptr_fun(boost::math::lround
< typename Derived::Scalar >
)), const Derived > 
CASM::lround (const Eigen::MatrixBase< Derived > &val)
 Round Eigen::MatrixXd to Eigen::MatrixXl. More...
 
template<typename Derived >
Derived::Scalar CASM::matrix_minor (const Eigen::MatrixBase< Derived > &M, int row, int col)
 Return the minor of integer Matrix M element row, col. More...
 
template<typename Derived >
Eigen::Matrix< typename
Derived::Scalar,
Derived::RowsAtCompileTime,
Derived::ColsAtCompileTime > 
CASM::cofactor (const Eigen::MatrixBase< Derived > &M)
 Return cofactor matrix. More...
 
template<typename Derived >
Eigen::Matrix< typename
Derived::Scalar,
Derived::RowsAtCompileTime,
Derived::ColsAtCompileTime > 
CASM::adjugate (const Eigen::MatrixBase< Derived > &M)
 Return adjugate matrix. More...
 
template<typename Derived >
Eigen::Matrix< typename
Derived::Scalar,
Derived::RowsAtCompileTime,
Derived::ColsAtCompileTime > 
CASM::inverse (const Eigen::MatrixBase< Derived > &M)
 Return the integer inverse matrix of an invertible integer matrix. More...
 
template<typename DerivedIn , typename DerivedOut >
void CASM::smith_normal_form (const Eigen::MatrixBase< DerivedIn > &M, Eigen::MatrixBase< DerivedOut > &U, Eigen::MatrixBase< DerivedOut > &S, Eigen::MatrixBase< DerivedOut > &V)
 Return the smith normal form, M == U*S*V. More...
 
std::vector< Eigen::Matrix3i > CASM::_unimodular_matrices (bool positive, bool negative)
 
const std::vector
< Eigen::Matrix3i > & 
CASM::positive_unimodular_matrices ()
 
const std::vector
< Eigen::Matrix3i > & 
CASM::negative_unimodular_matrices ()
 
const std::vector
< Eigen::Matrix3i > & 
CASM::unimodular_matrices ()
 

Function Documentation

std::vector< Eigen::Matrix3i > CASM::_unimodular_matrices ( bool  positive,
bool  negative 
)

Definition at line 182 of file LinearAlgebra.cc.

template<typename Derived >
Eigen::Matrix<typename Derived::Scalar, Derived::RowsAtCompileTime, Derived::ColsAtCompileTime> CASM::adjugate ( const Eigen::MatrixBase< Derived > &  M)

Return adjugate matrix.

Returns
adjugate matrix
Parameters
Mmatrix

The adjugate matrix is the transpose of the cofactor matrix. The adjugate matrix is related to the inverse of a matrix through

M.inverse() == adjugate(M)/M.determinant()

Definition at line 184 of file LinearAlgebra.hh.

double CASM::angle ( const Eigen::Ref< const Eigen::Vector3d > &  a,
const Eigen::Ref< const Eigen::Vector3d > &  b 
)

Get angle, in radians, between two vectors on range [0,pi].

Definition at line 154 of file LinearAlgebra.cc.

template<typename Derived >
Eigen::Matrix<typename Derived::Scalar, Derived::RowsAtCompileTime, Derived::ColsAtCompileTime> CASM::cofactor ( const Eigen::MatrixBase< Derived > &  M)

Return cofactor matrix.

Returns
cofactor matrix
Parameters
Mmatrix

The cofactor matrix is

C(i,j) = pow(-1,i+j)*matrix_minor(M,i,j)

Definition at line 156 of file LinearAlgebra.hh.

void CASM::get_Hermitian ( Eigen::MatrixXcd &  original_mat,
Eigen::MatrixXcd &  hermitian_mat,
Eigen::MatrixXcd &  antihermitian_mat 
)

Given a matrix, original_mat, this function calculates both the Hermitian and anti-Hermitian parts.

Parameters
[in]original_matThe matrix we want to get the Hermitian and anti-Hermitian parts of
[in,out]hermitian_matThe Hermitian matrix
[in,out]antihermitian_matThe anti-Hermitian matrix

Definition at line 21 of file LinearAlgebra.cc.

std::pair< Eigen::MatrixXi, Eigen::MatrixXi > CASM::hermite_normal_form ( const Eigen::MatrixXi &  M)

Return the hermite normal form, M == H*V.

Parameters
Ma square integer matrix
Exceptions
std::runtime_errorif M is not full rank
Returns
std::pair<H,V>

H set to upper triangular matrix H with:

  • H(i,i) > 0
  • 0 <= H(r,i) < H(i,i) for r > i
  • H(r,i) == 0 for r < i V set to unimodular matrix V
  • V.determinant() = +/- 1

Definition at line 61 of file LinearAlgebra.cc.

template<typename Derived >
Eigen::Matrix<typename Derived::Scalar, Derived::RowsAtCompileTime, Derived::ColsAtCompileTime> CASM::inverse ( const Eigen::MatrixBase< Derived > &  M)

Return the integer inverse matrix of an invertible integer matrix.

Returns
a 3x3 integer matrix inverse
Parameters
Man 3x3 invertible integer matrix

Definition at line 222 of file LinearAlgebra.hh.

template<typename Derived >
Eigen::CwiseUnaryOp< decltype(std::ptr_fun(boost::math::iround<typename Derived::Scalar>)) , const Derived > CASM::iround ( const Eigen::MatrixBase< Derived > &  val)

Round Eigen::MatrixXd to Eigen::MatrixXi.

Returns
an Eigen:MatrixXi
Parameters
MEigen::MatrixXd to be rounded to integer

For each coefficient, sets

Mint(i,j) = boost::math::iround(Mdouble(i, j))

Definition at line 93 of file LinearAlgebra.hh.

template<typename Derived >
bool CASM::is_diagonal ( const Eigen::MatrixBase< Derived > &  M,
double  tol = TOL 
)

Check if Eigen::Matrix is diagonal.

Definition at line 79 of file LinearAlgebra.hh.

bool CASM::is_Hermitian ( Eigen::MatrixXcd &  mat)

Returns true if the specified matrix is Hermitian.

Checks if the matrix is the same as the conjugate

Definition at line 37 of file LinearAlgebra.cc.

template<typename Derived >
bool CASM::is_integer ( const Eigen::MatrixBase< Derived > &  M,
double  tol 
)

Check if Eigen::Matrix is integer.

Definition at line 61 of file LinearAlgebra.hh.

template<typename Derived >
bool CASM::is_unimodular ( const Eigen::MatrixBase< Derived > &  M,
double  tol 
)

Check if Eigen::Matrix is unimodular.

Definition at line 73 of file LinearAlgebra.hh.

template<typename Derived >
Eigen::CwiseUnaryOp< decltype(std::ptr_fun(boost::math::lround<typename Derived::Scalar>)) , const Derived > CASM::lround ( const Eigen::MatrixBase< Derived > &  val)

Round Eigen::MatrixXd to Eigen::MatrixXl.

Returns
an Eigen:MatrixXl
Parameters
MEigen::MatrixXd to be rounded to integer

For each coefficient, sets

Mint(i,j) = std::lround(Mdouble(i, j))

Definition at line 107 of file LinearAlgebra.hh.

template<typename Derived >
Derived::Scalar CASM::matrix_minor ( const Eigen::MatrixBase< Derived > &  M,
int  row,
int  col 
)

Return the minor of integer Matrix M element row, col.

Returns
the minor of element row, col
Parameters
Mmatrix
row,colelement row and column

The minor of element row, col of a matrix is the determinant of the submatrix of M which does not include any elements from row 'row' or column 'col'

Definition at line 122 of file LinearAlgebra.hh.

const std::vector< Eigen::Matrix3i > & CASM::negative_unimodular_matrices ( )

Definition at line 212 of file LinearAlgebra.cc.

void CASM::poly_fit ( Eigen::VectorXcd &  xvec,
Eigen::VectorXcd &  yvec,
Eigen::VectorXcd &  coeffs,
int  degree 
)

Definition at line 308 of file CASM_math.cc.

const std::vector< Eigen::Matrix3i > & CASM::positive_unimodular_matrices ( )

Definition at line 207 of file LinearAlgebra.cc.

Eigen::MatrixXd CASM::pretty ( const Eigen::MatrixXd &  M,
double  tol 
)

Round entries that are within tol of being integer to that integer value.

Definition at line 170 of file LinearAlgebra.cc.

double CASM::signed_angle ( const Eigen::Ref< const Eigen::Vector3d > &  a,
const Eigen::Ref< const Eigen::Vector3d > &  b,
const Eigen::Ref< const Eigen::Vector3d > &  pos_ref 
)

signed angle, in radians, between -pi and pi that describe separation in direction of two vectors

return signed angle, in radians, between -pi and pi that describe separation in direction of two vectors

Definition at line 159 of file LinearAlgebra.cc.

template<typename DerivedIn , typename DerivedOut >
void CASM::smith_normal_form ( const Eigen::MatrixBase< DerivedIn > &  M,
Eigen::MatrixBase< DerivedOut > &  U,
Eigen::MatrixBase< DerivedOut > &  S,
Eigen::MatrixBase< DerivedOut > &  V 
)

Return the smith normal form, M == U*S*V.

Parameters
M3x3 integer matrix
[out]Uset to U: is integer, U.determinant() == 1
[out]Sset to S: is diagonal, integer, and nonnegative, S(i,i) divides S(i+1,i+1) for all i
[out]Vset to V: is integer, V.determinant() == 1

Adapted from Matlab implementation written by John Gilbert (gilbe.nosp@m.rt@p.nosp@m.arc.x.nosp@m.erox.nosp@m..com):

Definition at line 237 of file LinearAlgebra.hh.

template<typename Derived >
Derived::Scalar CASM::triple_prod ( const Derived &  vec0,
const Derived &  vec1,
const Derived &  vec2 
)

Definition at line 53 of file LinearAlgebra.hh.

const std::vector< Eigen::Matrix3i > & CASM::unimodular_matrices ( )

Definition at line 217 of file LinearAlgebra.cc.