# Class DenseSymShiftSolve

## Description ¶

This class defines the shift-solve operation on a real symmetric matrix $A$, i.e., calculating $y=(A-\sigma I)^{-1}x$ for any real $\sigma$ and vector $x$. It is mainly used in the SymEigsShiftSolver eigen solver.

## Examples¶

//
//


## Methods Summary

 DenseSymShiftSolve Constructor to create the matrix operation object. rows Return the number of rows of the underlying matrix. cols Return the number of columns of the underlying matrix. set_shift Set the real shift $\sigma$. perform_op Perform the shift-solve operation $y=(A-\sigma I)^{-1}x$.

## Source ¶

From lines 25-86 in include/MatOp/DenseSymShiftSolve.h

class DenseSymShiftSolve
{
private:
typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic> Matrix;
typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1> Vector;
typedef Eigen::Map<const Matrix> MapMat;
typedef Eigen::Map< Eigen::Matrix<Scalar, Eigen::Dynamic, 1> > MapVec;

typedef const Eigen::Ref<const Matrix> ConstGenericMatrix;

const MapMat m_mat;
const int m_n;
Eigen::LDLT<Matrix> m_solver;

public:
///
/// Constructor to create the matrix operation object.
///
/// \param mat_ An **Eigen** matrix object, whose type can be
/// Eigen::Matrix<Scalar, ...> (e.g. Eigen::MatrixXd and
/// Eigen::MatrixXf), or its mapped version
/// (e.g. Eigen::Map<Eigen::MatrixXd>).
///
DenseSymShiftSolve(ConstGenericMatrix& mat_) :
m_mat(mat_.data(), mat_.rows(), mat_.cols()),
m_n(mat_.rows())
{
if(mat_.rows() != mat_.cols())
throw std::invalid_argument("DenseSymShiftSolve: matrix must be square");
}

///
/// Return the number of rows of the underlying matrix.
///
int rows() const { return m_n; }
///
/// Return the number of columns of the underlying matrix.
///
int cols() const { return m_n; }

///
/// Set the real shift \f$\sigma\f$.
///
void set_shift(Scalar sigma)
{
m_solver.compute(m_mat - sigma * Matrix::Identity(m_n, m_n));
}

///
/// Perform the shift-solve operation \f$y=(A-\sigma I)^{-1}x\f$.
///
/// \param x_in  Pointer to the \f$x\f$ vector.
/// \param y_out Pointer to the \f$y\f$ vector.
///
// y_out = inv(A - sigma * I) * x_in
void perform_op(Scalar* x_in, Scalar* y_out) const
{
MapVec x(x_in,  m_n);
MapVec y(y_out, m_n);
y.noalias() = m_solver.solve(x);
}
};


## Discussions¶

There are 0 discussions relevant for this page, and 0 discussions in the whole project.