Go to the documentation of this file.
11 #ifndef EIGEN_SELFADJOINTEIGENSOLVER_H
12 #define EIGEN_SELFADJOINTEIGENSOLVER_H
18 template<
typename _MatrixType>
19 class GeneralizedSelfAdjointEigenSolver;
24 template<
typename MatrixType,
typename DiagType,
typename SubDiagType>
82 Size = MatrixType::RowsAtCompileTime,
171 template<
typename InputType>
214 template<
typename InputType>
411 template<
int StorageOrder,
typename RealScalar,
typename Scalar,
typename Index>
416 template<
typename MatrixType>
417 template<
typename InputType>
422 check_template_parameters();
430 &&
"invalid option parameter");
433 m_eivalues.resize(
n,1);
438 m_eivalues.coeffRef(0,0) =
numext::real(m_eivec.coeff(0,0));
439 if(computeEigenvectors)
440 m_eivec.setOnes(
n,
n);
442 m_isInitialized =
true;
443 m_eigenvectorsOk = computeEigenvectors;
456 m_subdiag.resize(
n-1);
457 m_hcoeffs.resize(
n-1);
465 m_isInitialized =
true;
466 m_eigenvectorsOk = computeEigenvectors;
470 template<
typename MatrixType>
479 if (computeEigenvectors)
481 m_eivec.setIdentity(
diag.size(),
diag.size());
485 m_isInitialized =
true;
486 m_eigenvectorsOk = computeEigenvectors;
502 template<
typename MatrixType,
typename DiagType,
typename SubDiagType>
525 const RealScalar scaled_subdiag = precision_inv * subdiag[
i];
542 if(
iter > maxIterations *
n)
break;
545 while (start>0 && subdiag[start-1]!=0)
548 internal::tridiagonal_qr_step<MatrixType::Flags&RowMajorBit ? RowMajor : ColMajor>(
diag.data(), subdiag.data(), start,
end, computeEigenvectors ? eivec.data() : (
Scalar*)0,
n);
550 if (
iter <= maxIterations *
n)
563 diag.segment(
i,
n-
i).minCoeff(&k);
567 if(computeEigenvectors)
568 eivec.col(
i).swap(eivec.col(k+
i));
575 template<
typename SolverType,
int Size,
bool IsComplex>
struct direct_selfadjoint_eigenvalues
607 Scalar c0 =
m(0,0)*
m(1,1)*
m(2,2) +
Scalar(2)*
m(1,0)*
m(2,0)*
m(2,1) -
m(0,0)*
m(2,1)*
m(2,1) -
m(1,1)*
m(2,0)*
m(2,0) -
m(2,2)*
m(1,0)*
m(1,0);
608 Scalar c1 =
m(0,0)*
m(1,1) -
m(1,0)*
m(1,0) +
m(0,0)*
m(2,2) -
m(2,0)*
m(2,0) +
m(1,1)*
m(2,2) -
m(2,1)*
m(2,1);
619 Scalar q = a_over_3*a_over_3*a_over_3 - half_b*half_b;
628 roots(0) = c2_over_3 - rho*(cos_theta + s_sqrt3*sin_theta);
629 roots(1) = c2_over_3 - rho*(cos_theta - s_sqrt3*sin_theta);
630 roots(2) = c2_over_3 +
Scalar(2)*rho*cos_theta;
640 mat.diagonal().cwiseAbs().maxCoeff(&
i0);
643 representative =
mat.col(
i0);
646 n0 = (c0 = representative.cross(
mat.col((
i0+1)%3))).squaredNorm();
647 n1 = (
c1 = representative.cross(
mat.col((
i0+2)%3))).squaredNorm();
660 &&
"invalid option parameter");
669 MatrixType scaledMat =
mat.template selfadjointView<Lower>();
670 scaledMat.diagonal().array() -= shift;
678 if(computeEigenvectors)
683 eivecs.setIdentity();
702 tmp.diagonal().array () -=
eivals(k);
704 extract_kernel(tmp, eivecs.col(k), eivecs.col(
l));
712 eivecs.col(
l) -= eivecs.col(k).dot(eivecs.col(
l))*eivecs.col(
l);
713 eivecs.col(
l).normalize();
718 tmp.diagonal().array () -=
eivals(
l);
721 extract_kernel(tmp, eivecs.col(
l),
dummy);
725 eivecs.col(1) = eivecs.col(2).cross(eivecs.col(0)).normalized();
734 solver.m_isInitialized =
true;
735 solver.m_eigenvectorsOk = computeEigenvectors;
740 template<
typename SolverType>
767 &&
"invalid option parameter");
776 scaledMat.coeffRef(0,1) =
mat.coeff(1,0);
777 scaledMat.diagonal().array() -= shift;
786 if(computeEigenvectors)
790 eivecs.setIdentity();
794 scaledMat.diagonal().array () -=
eivals(1);
800 eivecs.col(1) << -scaledMat(1,0), scaledMat(0,0);
805 eivecs.col(1) << -scaledMat(1,1), scaledMat(1,0);
809 eivecs.col(0) << eivecs.col(1).unitOrthogonal();
818 solver.m_isInitialized =
true;
819 solver.m_eigenvectorsOk = computeEigenvectors;
825 template<
typename MatrixType>
837 template<
int StorageOrder,
typename RealScalar,
typename Scalar,
typename Index>
869 rot.makeGivens(
x,
z);
877 subdiag[k] =
rot.c() * sdk -
rot.s() * dkp1;
880 subdiag[k - 1] =
rot.c() * subdiag[k-1] -
rot.s() *
z;
886 z = -
rot.s() * subdiag[k+1];
887 subdiag[k + 1] =
rot.c() * subdiag[k+1];
895 q.applyOnTheRight(k,k+1,
rot);
904 #endif // EIGEN_SELFADJOINTEIGENSOLVER_H
EIGEN_DEVICE_FUNC SelfAdjointEigenSolver & computeDirect(const MatrixType &matrix, int options=ComputeEigenvectors)
Computes eigendecomposition of given matrix using a closed-form algorithm.
#define EIGEN_DEVICE_FUNC
Namespace containing all symbols from the Eigen library.
SolverType::EigenvectorsType EigenvectorsType
static EIGEN_DEVICE_FUNC void run(SolverType &eig, const typename SolverType::MatrixType &A, int options)
EIGEN_DEVICE_FUNC Derived & derived()
const AutoDiffScalar< Matrix< typename internal::traits< typename internal::remove_all< DerTypeA >::type >::Scalar, Dynamic, 1 > > atan2(const AutoDiffScalar< DerTypeA > &a, const AutoDiffScalar< DerTypeB > &b)
Tridiagonal decomposition of a selfadjoint matrix.
#define EIGEN_USING_STD(FUNC)
Array< double, 1, 3 > e(1./3., 0.5, 2.)
SolverType::EigenvectorsType EigenvectorsType
Jet< T, N > sin(const Jet< T, N > &f)
SolverType::Scalar Scalar
SelfAdjointEigenSolver & computeFromTridiagonal(const RealVectorType &diag, const SubDiagonalType &subdiag, int options=ComputeEigenvectors)
Computes the eigen decomposition from a tridiagonal symmetric matrix.
static EIGEN_DEVICE_FUNC void computeRoots(const MatrixType &m, VectorType &roots)
EIGEN_DEVICE_FUNC ComputationInfo computeFromTridiagonal_impl(DiagType &diag, SubDiagType &subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType &eivec)
Matrix diag(const std::vector< Matrix > &Hs)
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
SolverType::RealVectorType VectorType
NumTraits< Scalar >::Real RealScalar
Real scalar type for _MatrixType.
TridiagonalizationType::SubDiagonalType SubDiagonalType
EIGEN_DEVICE_FUNC SelfAdjointEigenSolver & compute(const EigenBase< InputType > &matrix, int options=ComputeEigenvectors)
Computes eigendecomposition of given matrix.
const EIGEN_DEVICE_FUNC RealVectorType & eigenvalues() const
Returns the eigenvalues of given matrix.
SolverType::Scalar Scalar
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
Rotation given by a cosine-sine pair.
static EIGEN_DEVICE_FUNC void check_template_parameters()
int EIGEN_BLAS_FUNC() rot(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy, RealScalar *pc, RealScalar *ps)
BiCGSTAB< SparseMatrix< double > > solver
TridiagonalizationType::SubDiagonalType m_subdiag
Jet< T, N > cos(const Jet< T, N > &f)
SolverType::RealVectorType VectorType
EIGEN_DEVICE_FUNC ComputationInfo info() const
Reports whether previous computation was successful.
static EIGEN_DEVICE_FUNC void run(SolverType &solver, const MatrixType &mat, int options)
internal::plain_col_type< MatrixType, RealScalar >::type RealVectorType
Type for vector of eigenvalues as returned by eigenvalues().
SolverType::MatrixType MatrixType
Matrix< Scalar, Size, Size, ColMajor, MaxColsAtCompileTime, MaxColsAtCompileTime > EigenvectorsType
const EIGEN_DEVICE_FUNC EigenvectorsType & eigenvectors() const
Returns the eigenvectors of given matrix.
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy y set format x g set format y g set format x2 g set format y2 g set format z g set angles radians set nogrid set key title set key left top Right noreverse box linetype linewidth samplen spacing width set nolabel set noarrow set nologscale set logscale x set set pointsize set encoding default set nopolar set noparametric set set set set surface set nocontour set clabel set mapping cartesian set nohidden3d set cntrparam order set cntrparam linear set cntrparam levels auto set cntrparam points set size set set xzeroaxis lt lw set x2zeroaxis lt lw set yzeroaxis lt lw set y2zeroaxis lt lw set tics in set ticslevel set tics scale
Computes eigenvalues and eigenvectors of selfadjoint matrices.
EIGEN_DEVICE_FUNC const Scalar & q
static const Line3 l(Rot3(), 1, 1)
EIGEN_DEVICE_FUNC MatrixType operatorInverseSqrt() const
Computes the inverse square root of the matrix.
SelfAdjointEigenSolver< PlainMatrixType > eig(mat, computeVectors?ComputeEigenvectors:EigenvaluesOnly)
A matrix or vector expression mapping an existing array of data.
TridiagonalizationType::CoeffVectorType m_hcoeffs
EIGEN_DEVICE_FUNC void tridiagonalization_inplace(MatrixType &matA, CoeffVectorType &hCoeffs)
SolverType::MatrixType MatrixType
Map< Matrix< T, Dynamic, Dynamic, ColMajor >, 0, OuterStride<> > matrix(T *data, int rows, int cols, int stride)
NumTraits< Scalar >::Real RealScalar
EIGEN_DEVICE_FUNC MatrixType operatorSqrt() const
Computes the positive-definite square root of the matrix.
EIGEN_DEVICE_FUNC bool abs2(bool x)
A matrix or vector expression mapping an existing expression.
EIGEN_STRONG_INLINE void swap(T &a, T &b)
static EIGEN_DEVICE_FUNC bool extract_kernel(MatrixType &mat, Ref< VectorType > res, Ref< VectorType > representative)
iterator iter(handle obj)
EIGEN_DEVICE_FUNC SelfAdjointEigenSolver(Index size)
Constructor, pre-allocates memory for dynamic-size matrices.
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE internal::enable_if< NumTraits< T >::IsSigned||NumTraits< T >::IsComplex, typename NumTraits< T >::Real >::type abs(const T &x)
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T &x, const T &y)
static const int m_maxIterations
Maximum number of iterations.
static const EIGEN_DEPRECATED end_t end
static EIGEN_DEVICE_FUNC void run(SolverType &solver, const MatrixType &mat, int options)
A triangularView< Lower >().adjoint().solveInPlace(B)
EIGEN_DEVICE_FUNC SelfAdjointEigenSolver(const EigenBase< InputType > &matrix, int options=ComputeEigenvectors)
Constructor; computes eigendecomposition of given matrix.
static EIGEN_DEVICE_FUNC void tridiagonal_qr_step(RealScalar *diag, RealScalar *subdiag, Index start, Index end, Scalar *matrixQ, Index n)
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Jet< T, N > sqrt(const Jet< T, N > &f)
RealVectorType m_eivalues
void computeRoots(const Matrix &m, Roots &roots)
MatrixType::Scalar Scalar
Scalar type for matrices of type _MatrixType.
static EIGEN_DEVICE_FUNC void computeRoots(const MatrixType &m, VectorType &roots)
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
#define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE)
gtsam
Author(s):
autogenerated on Sat Nov 16 2024 04:04:03