11 #ifndef EIGEN_EIGENSOLVER_H
12 #define EIGEN_EIGENSOLVER_H
67 template <
typename MatrixType_>
150 template <
typename InputType>
278 template <
typename InputType>
318 template <
typename MatrixType>
320 eigen_assert(m_isInitialized &&
"EigenSolver is not initialized.");
322 const Index n = m_eivalues.rows();
325 for (;
i <
n - 1; ++
i) {
328 matD.coeffRef(
i,
i) =
real;
330 matD.coeffRef(
i,
i + 1) =
imag;
331 matD.coeffRef(
i + 1,
i) = -
imag;
332 matD.coeffRef(
i + 1,
i + 1) =
real;
343 template <
typename MatrixType>
345 eigen_assert(m_isInitialized &&
"EigenSolver is not initialized.");
346 eigen_assert(m_eigenvectorsOk &&
"The eigenvectors have not been computed together with the eigenvalues.");
354 matV.col(
j) = m_eivec.col(
j).template cast<ComplexScalar>();
355 matV.col(
j).normalize();
362 matV.col(
j).normalize();
363 matV.col(
j + 1).normalize();
370 template <
typename MatrixType>
371 template <
typename InputType>
373 bool computeEigenvectors) {
374 check_template_parameters();
382 m_realSchur.compute(
matrix.derived(), computeEigenvectors);
384 m_info = m_realSchur.info();
387 m_matT = m_realSchur.matrixT();
388 if (computeEigenvectors) m_eivec = m_realSchur.matrixU();
391 m_eivalues.resize(
matrix.cols());
395 m_eivalues.coeffRef(
i) = m_matT.coeff(
i,
i);
396 if (!(
isfinite)(m_eivalues.coeffRef(
i))) {
397 m_isInitialized =
true;
398 m_eigenvectorsOk =
false;
411 Scalar maxval = numext::maxi<Scalar>(
abs(
p), numext::maxi<Scalar>(
abs(t0),
abs(t1)));
420 if (!((
isfinite)(m_eivalues.coeffRef(
i)) && (
isfinite)(m_eivalues.coeffRef(
i + 1)))) {
421 m_isInitialized =
true;
422 m_eigenvectorsOk =
false;
431 if (computeEigenvectors) doComputeEigenvectors();
434 m_isInitialized =
true;
435 m_eigenvectorsOk = computeEigenvectors;
440 template <
typename MatrixType>
458 Scalar p = m_eivalues.coeff(
n).real();
459 Scalar q = m_eivalues.coeff(
n).imag();
463 Scalar lastr(0), lastw(0);
469 Scalar r = m_matT.row(
i).segment(l,
n - l + 1).dot(m_matT.col(
n).segment(l,
n - l + 1));
471 if (m_eivalues.coeff(
i).imag() <
Scalar(0)) {
476 if (m_eivalues.coeff(
i).imag() ==
Scalar(0)) {
478 m_matT.coeffRef(
i,
n) = -
r /
w;
480 m_matT.coeffRef(
i,
n) = -
r / (
eps * norm);
485 Scalar denom = (m_eivalues.coeff(
i).real() -
p) * (m_eivalues.coeff(
i).real() -
p) +
486 m_eivalues.coeff(
i).imag() * m_eivalues.coeff(
i).imag();
487 Scalar t = (
x * lastr - lastw *
r) / denom;
488 m_matT.coeffRef(
i,
n) =
t;
490 m_matT.coeffRef(
i + 1,
n) = (-
r -
w *
t) /
x;
492 m_matT.coeffRef(
i + 1,
n) = (-lastr -
y *
t) / lastw;
502 Scalar lastra(0), lastsa(0), lastw(0);
506 if (
abs(m_matT.coeff(
n,
n - 1)) >
abs(m_matT.coeff(
n - 1,
n))) {
507 m_matT.coeffRef(
n - 1,
n - 1) =
q / m_matT.coeff(
n,
n - 1);
508 m_matT.coeffRef(
n - 1,
n) = -(m_matT.coeff(
n,
n) -
p) / m_matT.coeff(
n,
n - 1);
515 m_matT.coeffRef(
n,
n - 1) =
Scalar(0);
518 Scalar ra = m_matT.row(
i).segment(l,
n - l + 1).dot(m_matT.col(
n - 1).segment(l,
n - l + 1));
519 Scalar sa = m_matT.row(
i).segment(l,
n - l + 1).dot(m_matT.col(
n).segment(l,
n - l + 1));
522 if (m_eivalues.coeff(
i).imag() <
Scalar(0)) {
536 Scalar vr = (m_eivalues.coeff(
i).real() -
p) * (m_eivalues.coeff(
i).real() -
p) +
537 m_eivalues.coeff(
i).imag() * m_eivalues.coeff(
i).imag() -
q *
q;
547 m_matT.coeffRef(
i + 1,
n - 1) = (-ra -
w * m_matT.coeff(
i,
n - 1) +
q * m_matT.coeff(
i,
n)) /
x;
548 m_matT.coeffRef(
i + 1,
n) = (-sa -
w * m_matT.coeff(
i,
n) -
q * m_matT.coeff(
i,
n - 1)) /
x;
550 cc =
ComplexScalar(-lastra -
y * m_matT.coeff(
i,
n - 1), -lastsa -
y * m_matT.coeff(
i,
n)) /
558 Scalar t = numext::maxi<Scalar>(
abs(m_matT.coeff(
i,
n - 1)),
abs(m_matT.coeff(
i,
n)));
566 eigen_assert(0 &&
"Internal bug in EigenSolver (INF or NaN has not been detected)");
572 m_tmp.noalias() = m_eivec.leftCols(
j + 1) * m_matT.col(
j).segment(0,
j + 1);
573 m_eivec.col(
j) = m_tmp;
AnnoyingScalar abs(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:135
AnnoyingScalar imag(const AnnoyingScalar &)
Definition: AnnoyingScalar.h:132
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
int i
Definition: BiCGSTAB_step_by_step.cpp:9
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
#define eigen_assert(x)
Definition: Macros.h:910
Vector3f p0
Definition: MatrixBase_all.cpp:2
RowVector3d w
Definition: Matrix_resize_int.cpp:3
#define EIGEN_STATIC_ASSERT(X, MSG)
Definition: StaticAssert.h:26
#define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE)
Definition: StaticAssert.h:74
float * p
Definition: Tutorial_Map_using.cpp:9
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
Computes eigenvalues and eigenvectors of general matrices.
Definition: EigenSolver.h:68
MatrixType::Scalar Scalar
Scalar type for matrices of type MatrixType.
Definition: EigenSolver.h:82
EigenSolver(const EigenBase< InputType > &matrix, bool computeEigenvectors=true)
Constructor; computes eigendecomposition of given matrix.
Definition: EigenSolver.h:151
const EigenvalueType & eigenvalues() const
Returns the eigenvalues of given matrix.
Definition: EigenSolver.h:246
MatrixType m_eivec
Definition: EigenSolver.h:306
void doComputeEigenvectors()
Definition: EigenSolver.h:441
EigenSolver(Index size)
Default constructor with memory preallocation.
Definition: EigenSolver.h:126
Matrix< Scalar, ColsAtCompileTime, 1, Options &~RowMajor, MaxColsAtCompileTime, 1 > ColumnVectorType
Definition: EigenSolver.h:314
MatrixType pseudoEigenvalueMatrix() const
Returns the block-diagonal matrix in the pseudo-eigendecomposition.
Definition: EigenSolver.h:319
RealSchur< MatrixType > m_realSchur
Definition: EigenSolver.h:311
ComputationInfo info() const
Definition: EigenSolver.h:283
EigenSolver & setMaxIterations(Index maxIters)
Sets the maximum number of iterations allowed.
Definition: EigenSolver.h:289
EigenvectorsType eigenvectors() const
Returns the eigenvectors of given matrix.
Definition: EigenSolver.h:344
std::complex< RealScalar > ComplexScalar
Complex scalar type for MatrixType.
Definition: EigenSolver.h:92
bool m_eigenvectorsOk
Definition: EigenSolver.h:309
EigenSolver()
Default constructor.
Definition: EigenSolver.h:117
Matrix< ComplexScalar, ColsAtCompileTime, 1, Options &~RowMajor, MaxColsAtCompileTime, 1 > EigenvalueType
Type for vector of eigenvalues as returned by eigenvalues().
Definition: EigenSolver.h:99
NumTraits< Scalar >::Real RealScalar
Definition: EigenSolver.h:83
static void check_template_parameters()
Definition: EigenSolver.h:301
Eigen::Index Index
Definition: EigenSolver.h:84
bool m_isInitialized
Definition: EigenSolver.h:308
EigenSolver & compute(const EigenBase< InputType > &matrix, bool computeEigenvectors=true)
Computes eigendecomposition of given matrix.
MatrixType m_matT
Definition: EigenSolver.h:312
@ MaxRowsAtCompileTime
Definition: EigenSolver.h:77
@ MaxColsAtCompileTime
Definition: EigenSolver.h:78
@ ColsAtCompileTime
Definition: EigenSolver.h:75
@ Options
Definition: EigenSolver.h:76
@ RowsAtCompileTime
Definition: EigenSolver.h:74
const MatrixType & pseudoEigenvectors() const
Returns the pseudo-eigenvectors of given matrix.
Definition: EigenSolver.h:202
Index getMaxIterations()
Returns the maximum number of iterations.
Definition: EigenSolver.h:295
Matrix< ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime > EigenvectorsType
Type for matrix of eigenvectors as returned by eigenvectors().
Definition: EigenSolver.h:108
MatrixType_ MatrixType
Synonym for the template parameter MatrixType_.
Definition: EigenSolver.h:71
ComputationInfo m_info
Definition: EigenSolver.h:310
EigenvalueType m_eivalues
Definition: EigenSolver.h:307
ColumnVectorType m_tmp
Definition: EigenSolver.h:315
EIGEN_DEVICE_FUNC constexpr EIGEN_STRONG_INLINE Scalar & coeffRef(Index rowId, Index colId)
Definition: PlainObjectBase.h:217
RealSchur & setMaxIterations(Index maxIters)
Sets the maximum number of iterations allowed.
Definition: RealSchur.h:204
Index getMaxIterations()
Returns the maximum number of iterations.
Definition: RealSchur.h:210
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 max(a, b)
Definition: datatypes.h:23
ComputationInfo
Definition: Constants.h:438
@ NumericalIssue
Definition: Constants.h:442
@ Success
Definition: Constants.h:440
Scalar * y
Definition: level1_cplx_impl.h:128
#define isfinite(X)
Definition: main.h:111
double eps
Definition: crbond_bessel.cc:24
EIGEN_DEVICE_FUNC bool isMuchSmallerThan(const Scalar &x, const OtherScalar &y, const typename NumTraits< Scalar >::Real &precision=NumTraits< Scalar >::dummy_precision())
Definition: MathFunctions.h:1916
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE bool() isfinite(const Eigen::bfloat16 &h)
Definition: BFloat16.h:752
EIGEN_DEVICE_FUNC const Scalar & q
Definition: SpecialFunctionsImpl.h:2019
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
const AutoDiffScalar< DerType > & real(const AutoDiffScalar< DerType > &x)
Definition: AutoDiffScalar.h:486
DerType::Scalar imag(const AutoDiffScalar< DerType > &)
Definition: AutoDiffScalar.h:490
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:83
double Zero
Definition: pseudosolid_node_update_elements.cc:35
double epsilon
Definition: osc_ring_sarah_asymptotics.h:43
list x
Definition: plotDoE.py:28
t
Definition: plotPSD.py:36
Definition: EigenBase.h:33
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Definition: ForwardDeclarations.h:21
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2