11 #ifndef EIGEN_SELFADJOINTEIGENSOLVER_H
12 #define EIGEN_SELFADJOINTEIGENSOLVER_H
21 template <
typename MatrixType_>
22 class GeneralizedSelfAdjointEigenSolver;
25 template <
typename SolverType,
int Size,
bool IsComplex>
26 struct direct_selfadjoint_eigenvalues;
28 template <
typename MatrixType,
typename DiagType,
typename SubDiagType>
30 const Index maxIterations,
bool computeEigenvectors,
81 template <
typename MatrixType_>
86 Size = MatrixType::RowsAtCompileTime,
174 template <
typename InputType>
217 template <
typename InputType>
402 template <
int StorageOrder,
typename RealScalar,
typename Scalar,
typename Index>
407 template <
typename MatrixType>
408 template <
typename InputType>
416 "invalid option parameter");
436 mat =
matrix.template triangularView<Lower>();
439 mat.template triangularView<Lower>() /= scale;
454 template <
typename MatrixType>
462 if (computeEigenvectors) {
484 template <
typename MatrixType,
typename DiagType,
typename SubDiagType>
486 const Index maxIterations,
bool computeEigenvectors,
506 const RealScalar scaled_subdiag = precision_inv * subdiag[
i];
521 if (iter > maxIterations *
n)
break;
526 internal::tridiagonal_qr_step<MatrixType::Flags & RowMajorBit ? RowMajor : ColMajor>(
527 diag.data(), subdiag.data(),
start,
end, computeEigenvectors ? eivec.data() : (
Scalar*)0,
n);
529 if (iter <= maxIterations *
n)
540 diag.segment(
i,
n -
i).minCoeff(&
k);
543 if (computeEigenvectors) eivec.col(
i).swap(eivec.col(
k +
i));
550 template <
typename SolverType,
int Size,
bool IsComplex>
553 eig.compute(
A, options);
557 template <
typename SolverType>
579 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) -
580 m(1, 1) *
m(2, 0) *
m(2, 0) -
m(2, 2) *
m(1, 0) *
m(1, 0);
581 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) -
587 Scalar c2_over_3 = c2 * s_inv3;
588 Scalar a_over_3 = (c2 * c2_over_3 - c1) * s_inv3;
591 Scalar half_b =
Scalar(0.5) * (c0 + c2_over_3 * (
Scalar(2) * c2_over_3 * c2_over_3 - c1));
593 Scalar q = a_over_3 * a_over_3 * a_over_3 - half_b * half_b;
602 roots(0) = c2_over_3 - rho * (cos_theta + s_sqrt3 * sin_theta);
603 roots(1) = c2_over_3 - rho * (cos_theta - s_sqrt3 * sin_theta);
604 roots(2) = c2_over_3 +
Scalar(2) * rho * cos_theta;
616 representative =
mat.col(i0);
619 n0 = (c0 = representative.cross(
mat.col((i0 + 1) % 3))).squaredNorm();
620 n1 = (c1 = representative.cross(
mat.col((i0 + 2) % 3))).squaredNorm();
632 "invalid option parameter");
642 MatrixType scaledMat =
mat.template selfadjointView<Lower>();
643 scaledMat.diagonal().array() -= shift;
644 Scalar scale = scaledMat.cwiseAbs().maxCoeff();
645 if (scale > 0) scaledMat /= scale;
651 if (computeEigenvectors) {
654 eivecs.setIdentity();
672 extract_kernel(
tmp, eivecs.col(
k), eivecs.col(l));
679 eivecs.col(l) -= eivecs.col(
k).dot(eivecs.col(l)) * eivecs.col(l);
680 eivecs.col(l).normalize();
686 extract_kernel(
tmp, eivecs.col(l), dummy);
690 eivecs.col(1) = eivecs.col(2).cross(eivecs.col(0)).normalized();
699 solver.m_isInitialized =
true;
700 solver.m_eigenvectorsOk = computeEigenvectors;
705 template <
typename SolverType>
726 "invalid option parameter");
736 scaledMat.diagonal().array() -= shift;
737 Scalar scale = scaledMat.cwiseAbs().maxCoeff();
738 if (scale >
Scalar(0)) scaledMat /= scale;
744 if (computeEigenvectors) {
746 eivecs.setIdentity();
748 scaledMat.diagonal().array() -=
eivals(1);
753 eivecs.col(1) << -scaledMat(1, 0), scaledMat(0, 0);
754 eivecs.col(1) /=
sqrt(a2 + b2);
756 eivecs.col(1) << -scaledMat(1, 1), scaledMat(1, 0);
757 eivecs.col(1) /=
sqrt(c2 + b2);
760 eivecs.col(0) << eivecs.col(1).unitOrthogonal();
769 solver.m_isInitialized =
true;
770 solver.m_eigenvectorsOk = computeEigenvectors;
776 template <
typename MatrixType>
787 template <
int StorageOrder,
typename RealScalar,
typename Scalar,
typename Index>
817 rot.makeGivens(
x, z);
826 subdiag[
k] =
rot.c() * sdk -
rot.s() * dkp1;
828 if (
k >
start) subdiag[
k - 1] =
rot.c() * subdiag[
k - 1] -
rot.s() * z;
833 z = -
rot.s() * subdiag[
k + 1];
834 subdiag[
k + 1] =
rot.c() * subdiag[
k + 1];
841 q.applyOnTheRight(
k,
k + 1,
rot);
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
AnnoyingScalar cos(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:136
AnnoyingScalar sin(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:137
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
BiCGSTAB< SparseMatrix< double > > solver
Definition: BiCGSTAB_simple.cpp:5
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Array< double, 1, 3 > e(1./3., 0.5, 2.)
Eigen::SparseMatrix< double > mat
Definition: EigenUnitTest.cpp:10
#define EIGEN_USING_STD(FUNC)
Definition: Macros.h:1090
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define eigen_assert(x)
Definition: Macros.h:910
VectorXcd eivals
Definition: MatrixBase_eigenvalues.cpp:2
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
Definition: PartialRedux_count.cpp:3
#define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE)
Definition: StaticAssert.h:74
int rows
Definition: Tutorial_commainit_02.cpp:1
int cols
Definition: Tutorial_commainit_02.cpp:1
Scalar Scalar int size
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
NumTraits< Scalar >::Real RealScalar
Definition: bench_gemm.cpp:46
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
Rotation given by a cosine-sine pair.
Definition: Jacobi.h:38
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:96
EIGEN_DEVICE_FUNC Derived & setOnes(Index size)
Definition: CwiseNullaryOp.h:708
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE const Scalar & coeff(Index rowId, Index colId) const
Definition: PlainObjectBase.h:198
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE void resize(Index rows, Index cols)
Definition: PlainObjectBase.h:294
A matrix or vector expression mapping an existing expression.
Definition: Ref.h:264
Computes eigenvalues and eigenvectors of selfadjoint matrices.
Definition: SelfAdjointEigenSolver.h:82
EIGEN_DEVICE_FUNC ComputationInfo info() const
Reports whether previous computation was successful.
Definition: SelfAdjointEigenSolver.h:356
TridiagonalizationType::CoeffVectorType m_hcoeffs
Definition: SelfAdjointEigenSolver.h:375
VectorType m_workspace
Definition: SelfAdjointEigenSolver.h:372
internal::plain_col_type< MatrixType, RealScalar >::type RealVectorType
Definition: SelfAdjointEigenSolver.h:114
TridiagonalizationType::SubDiagonalType m_subdiag
Definition: SelfAdjointEigenSolver.h:374
MatrixType_ MatrixType
Definition: SelfAdjointEigenSolver.h:84
RealVectorType m_eivalues
Definition: SelfAdjointEigenSolver.h:373
SelfAdjointEigenSolver & computeFromTridiagonal(const RealVectorType &diag, const SubDiagonalType &subdiag, int options=ComputeEigenvectors)
Computes the eigen decomposition from a tridiagonal symmetric matrix.
Definition: SelfAdjointEigenSolver.h:455
EIGEN_DEVICE_FUNC SelfAdjointEigenSolver(const EigenBase< InputType > &matrix, int options=ComputeEigenvectors)
Constructor; computes eigendecomposition of given matrix.
Definition: SelfAdjointEigenSolver.h:175
ComputationInfo m_info
Definition: SelfAdjointEigenSolver.h:376
NumTraits< Scalar >::Real RealScalar
Real scalar type for MatrixType_.
Definition: SelfAdjointEigenSolver.h:104
bool m_eigenvectorsOk
Definition: SelfAdjointEigenSolver.h:378
EIGEN_DEVICE_FUNC SelfAdjointEigenSolver & computeDirect(const MatrixType &matrix, int options=ComputeEigenvectors)
Computes eigendecomposition of given matrix using a closed-form algorithm.
Definition: SelfAdjointEigenSolver.h:777
EIGEN_DEVICE_FUNC SelfAdjointEigenSolver & compute(const EigenBase< InputType > &matrix, int options=ComputeEigenvectors)
Computes eigendecomposition of given matrix.
EIGEN_DEVICE_FUNC SelfAdjointEigenSolver(Index size)
Constructor, pre-allocates memory for dynamic-size matrices.
Definition: SelfAdjointEigenSolver.h:150
EIGEN_DEVICE_FUNC MatrixType operatorSqrt() const
Computes the positive-definite square root of the matrix.
Definition: SelfAdjointEigenSolver.h:322
Eigen::Index Index
Definition: SelfAdjointEigenSolver.h:94
MatrixType::Scalar Scalar
Scalar type for matrices of type MatrixType_.
Definition: SelfAdjointEigenSolver.h:93
@ ColsAtCompileTime
Definition: SelfAdjointEigenSolver.h:87
@ Options
Definition: SelfAdjointEigenSolver.h:88
@ MaxColsAtCompileTime
Definition: SelfAdjointEigenSolver.h:89
@ Size
Definition: SelfAdjointEigenSolver.h:86
EIGEN_DEVICE_FUNC const EigenvectorsType & eigenvectors() const
Returns the eigenvectors of given matrix.
Definition: SelfAdjointEigenSolver.h:279
bool m_isInitialized
Definition: SelfAdjointEigenSolver.h:377
EIGEN_DEVICE_FUNC MatrixType operatorInverseSqrt() const
Computes the inverse square root of the matrix.
Definition: SelfAdjointEigenSolver.h:346
EigenvectorsType m_eivec
Definition: SelfAdjointEigenSolver.h:371
Matrix< Scalar, Size, Size, ColMajor, MaxColsAtCompileTime, MaxColsAtCompileTime > EigenvectorsType
Definition: SelfAdjointEigenSolver.h:96
EIGEN_DEVICE_FUNC const RealVectorType & eigenvalues() const
Returns the eigenvalues of given matrix.
Definition: SelfAdjointEigenSolver.h:300
static const int m_maxIterations
Maximum number of iterations.
Definition: SelfAdjointEigenSolver.h:366
internal::plain_col_type< MatrixType, Scalar >::type VectorType
Type for vector of eigenvalues as returned by eigenvalues().
Definition: SelfAdjointEigenSolver.h:113
Scalar coeff(Index row, Index col) const
Definition: SparseMatrix.h:211
const ConstDiagonalReturnType diagonal() const
Definition: SparseMatrix.h:757
Index cols() const
Definition: SparseMatrix.h:161
Scalar & coeffRef(Index row, Index col)
Definition: SparseMatrix.h:275
Index rows() const
Definition: SparseMatrix.h:159
Tridiagonal decomposition of a selfadjoint matrix.
Definition: Tridiagonalization.h:66
@ IsComplex
Definition: common.h:73
Eigen::Map< Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor >, 0, Eigen::OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition: common.h:85
float real
Definition: datatypes.h:10
#define min(a, b)
Definition: datatypes.h:22
void computeRoots(const Matrix &m, Roots &roots)
Definition: eig33.cpp:49
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
static EIGEN_DEVICE_FUNC void tridiagonal_qr_step(RealScalar *diag, RealScalar *subdiag, Index start, Index end, Scalar *matrixQ, Index n)
Definition: SelfAdjointEigenSolver.h:788
ComputationInfo
Definition: Constants.h:438
@ Success
Definition: Constants.h:440
@ NoConvergence
Definition: Constants.h:444
@ GenEigMask
Definition: Constants.h:414
@ EigVecMask
Definition: Constants.h:403
@ ComputeEigenvectors
Definition: Constants.h:401
EIGEN_BLAS_FUNC() rot(int *n, Scalar *px, int *incx, Scalar *py, int *incy, Scalar *pc, Scalar *ps)
Definition: level1_real_impl.h:88
int * m
Definition: level2_cplx_impl.h:294
const char const char const char * diag
Definition: level2_impl.h:86
char char char int int * k
Definition: level2_impl.h:374
Eigen::Matrix< Scalar, Dynamic, Dynamic, ColMajor > tmp
Definition: level3_impl.h:365
double theta
Definition: two_d_biharmonic.cc:236
EIGEN_DEVICE_FUNC void tridiagonalization_inplace(MatrixType &matA, CoeffVectorType &hCoeffs)
Definition: Tridiagonalization.h:332
EIGEN_DEVICE_FUNC ComputationInfo computeFromTridiagonal_impl(DiagType &diag, SubDiagType &subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType &eivec)
Compute the eigendecomposition from a tridiagonal matrix.
Definition: SelfAdjointEigenSolver.h:485
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T &x, const T &y)
Definition: MathFunctions.h:926
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE std::enable_if_t< NumTraits< T >::IsSigned||NumTraits< T >::IsComplex, typename NumTraits< T >::Real > abs(const T &x)
Definition: MathFunctions.h:1355
EIGEN_STRONG_INLINE void swap(T &a, T &b)
Definition: Meta.h:536
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bool is_exactly_zero(const X &x)
Definition: Meta.h:592
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019
EIGEN_DEVICE_FUNC bool abs2(bool x)
Definition: MathFunctions.h:1102
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
auto run(Kernel kernel, Args &&... args) -> decltype(kernel(args...))
Definition: gpu_test_helper.h:414
AutoDiffScalar< Matrix< typename internal::traits< internal::remove_all_t< DerTypeA > >::Scalar, Dynamic, 1 > > atan2(const AutoDiffScalar< DerTypeA > &a, const AutoDiffScalar< DerTypeB > &b)
Definition: AutoDiffScalar.h:558
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
std::complex< double > mu
Definition: time_harmonic_fourier_decomposed_linear_elasticity/cylinder/cylinder.cc:52
type
Definition: compute_granudrum_aor.py:141
Definition: Eigen_Colamd.h:49
void start(const unsigned &i)
(Re-)start i-th timer
Definition: oomph_utilities.cc:243
double epsilon
Definition: osc_ring_sarah_asymptotics.h:43
list x
Definition: plotDoE.py:28
Definition: EigenBase.h:33
constexpr EIGEN_DEVICE_FUNC Derived & derived()
Definition: EigenBase.h:49
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
static EIGEN_DEVICE_FUNC void computeRoots(const MatrixType &m, VectorType &roots)
Definition: SelfAdjointEigenSolver.h:712
SolverType::Scalar Scalar
Definition: SelfAdjointEigenSolver.h:709
SolverType::RealVectorType VectorType
Definition: SelfAdjointEigenSolver.h:708
SolverType::EigenvectorsType EigenvectorsType
Definition: SelfAdjointEigenSolver.h:710
SolverType::MatrixType MatrixType
Definition: SelfAdjointEigenSolver.h:707
static EIGEN_DEVICE_FUNC void run(SolverType &solver, const MatrixType &mat, int options)
Definition: SelfAdjointEigenSolver.h:720
SolverType::RealVectorType VectorType
Definition: SelfAdjointEigenSolver.h:560
SolverType::Scalar Scalar
Definition: SelfAdjointEigenSolver.h:561
SolverType::EigenvectorsType EigenvectorsType
Definition: SelfAdjointEigenSolver.h:562
SolverType::MatrixType MatrixType
Definition: SelfAdjointEigenSolver.h:559
static EIGEN_DEVICE_FUNC void run(SolverType &solver, const MatrixType &mat, int options)
Definition: SelfAdjointEigenSolver.h:629
static EIGEN_DEVICE_FUNC void computeRoots(const MatrixType &m, VectorType &roots)
Definition: SelfAdjointEigenSolver.h:568
static EIGEN_DEVICE_FUNC bool extract_kernel(MatrixType &mat, Ref< VectorType > res, Ref< VectorType > representative)
Definition: SelfAdjointEigenSolver.h:607
Definition: SelfAdjointEigenSolver.h:551
static EIGEN_DEVICE_FUNC void run(SolverType &eig, const typename SolverType::MatrixType &A, int options)
Definition: SelfAdjointEigenSolver.h:552
Definition: XprHelper.h:772
Definition: ForwardDeclarations.h:21
Definition: fft_test_shared.h:66