mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-13 12:19:12 +08:00
SelfAdjointEigenSolver: add operatorSqrt() and operatorInverseSqrt()
This commit is contained in:
parent
84bb868f07
commit
e4980616fd
@ -105,6 +105,25 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
|
|||||||
/** \returns the computed eigen values */
|
/** \returns the computed eigen values */
|
||||||
RealVectorType eigenvalues(void) const { return m_eivalues; }
|
RealVectorType eigenvalues(void) const { return m_eivalues; }
|
||||||
|
|
||||||
|
/** \returns the positive square root of the matrix
|
||||||
|
*
|
||||||
|
* \note the matrix itself must be positive in order for this to make sense.
|
||||||
|
*/
|
||||||
|
MatrixType operatorSqrt() const
|
||||||
|
{
|
||||||
|
return m_eivec * m_eivalues.cwise().sqrt().asDiagonal() * m_eivec.adjoint();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \returns the positive inverse square root of the matrix
|
||||||
|
*
|
||||||
|
* \note the matrix itself must be positive definite in order for this to make sense.
|
||||||
|
*/
|
||||||
|
MatrixType operatorInverseSqrt() const
|
||||||
|
{
|
||||||
|
return m_eivec * m_eivalues.cwise().inverse().cwise().sqrt().asDiagonal() * m_eivec.adjoint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MatrixType m_eivec;
|
MatrixType m_eivec;
|
||||||
RealVectorType m_eivalues;
|
RealVectorType m_eivalues;
|
||||||
|
@ -108,6 +108,9 @@ template<typename MatrixType> void selfadjointeigensolver(const MatrixType& m)
|
|||||||
VERIFY((symmA * eiSymmGen.eigenvectors()).isApprox(
|
VERIFY((symmA * eiSymmGen.eigenvectors()).isApprox(
|
||||||
symmB * (eiSymmGen.eigenvectors() * eiSymmGen.eigenvalues().asDiagonal().eval()), largerEps));
|
symmB * (eiSymmGen.eigenvectors() * eiSymmGen.eigenvalues().asDiagonal().eval()), largerEps));
|
||||||
|
|
||||||
|
MatrixType sqrtSymmA = eiSymm.operatorSqrt();
|
||||||
|
VERIFY(symmA.isApprox(sqrtSymmA*sqrtSymmA, ei_sqrt(test_precision<RealScalar>())));
|
||||||
|
VERIFY(sqrtSymmA.isApprox(symmA*eiSymm.operatorInverseSqrt(), ei_sqrt(test_precision<RealScalar>())));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatrixType> void eigensolver(const MatrixType& m)
|
template<typename MatrixType> void eigensolver(const MatrixType& m)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user