13#ifndef EIGEN_COMPLEX_EIGEN_SOLVER_H
14#define EIGEN_COMPLEX_EIGEN_SOLVER_H
16#include "./ComplexSchur.h"
19#include "./InternalHeaderCheck.h"
49template <
typename MatrixType_>
56 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
57 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
58 Options = internal::plain_object_options<MatrixType>::value,
59 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
60 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
64 using Scalar =
typename MatrixType::Scalar;
65 using RealScalar =
typename NumTraits<Scalar>::Real;
96 ComplexEigenSolver() : m_eivec(), m_eivalues(), m_schur(), m_isInitialized(false), m_eigenvectorsOk(false) {}
105 : m_eivec(size, size), m_eivalues(size), m_schur(size), m_isInitialized(false), m_eigenvectorsOk(false) {}
116 template <
typename InputType>
118 : m_eivec(matrix.rows(), matrix.cols()),
119 m_eivalues(matrix.cols()),
120 m_schur(matrix.derived(), computeEigenvectors),
121 m_isInitialized(false),
122 m_eigenvectorsOk(false) {
123 computeFromSchur(computeEigenvectors);
137 template <
typename InputType>
139 : m_eivec(matrix.rows(), matrix.cols()),
140 m_eivalues(matrix.cols()),
141 m_schur(matrix.derived(), computeEigenvectors),
142 m_isInitialized(false),
143 m_eigenvectorsOk(false) {
144 computeFromSchur(computeEigenvectors);
168 eigen_assert(m_isInitialized &&
"ComplexEigenSolver is not initialized.");
169 eigen_assert(m_eigenvectorsOk &&
"The eigenvectors have not been computed together with the eigenvalues.");
192 eigen_assert(m_isInitialized &&
"ComplexEigenSolver is not initialized.");
220 template <
typename InputType>
228 eigen_assert(m_isInitialized &&
"ComplexEigenSolver is not initialized.");
229 return m_schur.info();
242 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
248 bool m_isInitialized;
249 bool m_eigenvectorsOk;
253 void doComputeEigenvectors(RealScalar matrixnorm);
254 void sortEigenvalues(
bool computeEigenvectors);
257template <
typename MatrixType>
258template <
typename InputType>
260 bool computeEigenvectors) {
262 eigen_assert(matrix.cols() == matrix.rows());
266 m_schur.compute(matrix.derived(), computeEigenvectors);
267 return computeFromSchur(computeEigenvectors);
272template <
typename MatrixType>
274 if (m_schur.info() ==
Success) {
275 m_eivalues = m_schur.matrixT().diagonal();
276 if (computeEigenvectors) doComputeEigenvectors(m_schur.matrixT().norm());
277 sortEigenvalues(computeEigenvectors);
280 m_isInitialized =
true;
281 m_eigenvectorsOk = computeEigenvectors;
285template <
typename MatrixType>
286void ComplexEigenSolver<MatrixType>::doComputeEigenvectors(RealScalar matrixnorm) {
287 const Index n = m_eivalues.size();
294 matX.template triangularView<StrictlyLower>().setZero();
295 for (Index k = n - 1; k >= 0; k--) {
297 for (Index i = k - 1; i >= 0; i--) {
298 matX.coeffRef(i, k) = -matX.coeff(i, k);
300 matX.coeffRef(i, k) -= (matX.row(i).segment(i + 1, k - i - 1) * matX.col(k).segment(i + 1, k - i - 1)).value();
301 ComplexScalar z = matX.coeff(i, i) - matX.coeff(k, k);
302 if (z == ComplexScalar(0)) {
305 numext::real_ref(z) = numext::maxi(std::numeric_limits<RealScalar>::epsilon() * matrixnorm,
306 (std::numeric_limits<RealScalar>::min)());
308 matX.coeffRef(i, k) /= z;
310 matX.coeffRef(k, k) = ComplexScalar(1.0, 0.0);
314 m_eivec.noalias() = m_schur.matrixU() * matX;
316 for (Index k = 0; k < n; k++) {
317 m_eivec.col(k).stableNormalize();
321template <
typename MatrixType>
322void ComplexEigenSolver<MatrixType>::sortEigenvalues(
bool computeEigenvectors) {
323 const Index n = m_eivalues.size();
324 for (Index i = 0; i < n; i++) {
326 m_eivalues.cwiseAbs().tail(n - i).minCoeff(&k);
329 std::swap(m_eivalues[k], m_eivalues[i]);
330 if (computeEigenvectors) m_eivec.col(i).swap(m_eivec.col(k));
Computes eigenvalues and eigenvectors of general complex matrices.
Definition ComplexEigenSolver.h:50
MatrixType_ MatrixType
Synonym for the template parameter MatrixType_.
Definition ComplexEigenSolver.h:53
ComplexEigenSolver & compute(const EigenBase< InputType > &matrix, bool computeEigenvectors=true)
Computes eigendecomposition of given matrix.
ComplexEigenSolver(Index size)
Default Constructor with memory preallocation.
Definition ComplexEigenSolver.h:104
internal::make_complex_t< Scalar > ComplexScalar
Complex scalar type for MatrixType.
Definition ComplexEigenSolver.h:74
ComplexEigenSolver()
Default constructor.
Definition ComplexEigenSolver.h:96
ComplexEigenSolver & setMaxIterations(Index maxIters)
Sets the maximum number of iterations allowed.
Definition ComplexEigenSolver.h:233
typename MatrixType::Scalar Scalar
Scalar type for matrices of type MatrixType.
Definition ComplexEigenSolver.h:64
ComplexEigenSolver(const EigenBase< InputType > &matrix, bool computeEigenvectors=true)
Constructor; computes eigendecomposition of given matrix.
Definition ComplexEigenSolver.h:117
ComplexEigenSolver(EigenBase< InputType > &matrix, bool computeEigenvectors=true)
Constructor for inplace decomposition .
Definition ComplexEigenSolver.h:138
const EigenvectorType & eigenvectors() const
Returns the eigenvectors of given matrix.
Definition ComplexEigenSolver.h:167
Matrix< ComplexScalar, ColsAtCompileTime, 1, Options &(~RowMajor), MaxColsAtCompileTime, 1 > EigenvalueType
Type for vector of eigenvalues as returned by eigenvalues().
Definition ComplexEigenSolver.h:81
Matrix< ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime > EigenvectorType
Type for matrix of eigenvectors as returned by eigenvectors().
Definition ComplexEigenSolver.h:88
Index getMaxIterations() const
Returns the maximum number of iterations.
Definition ComplexEigenSolver.h:239
const EigenvalueType & eigenvalues() const
Returns the eigenvalues of given matrix.
Definition ComplexEigenSolver.h:191
ComputationInfo info() const
Reports whether previous computation was successful.
Definition ComplexEigenSolver.h:227
Eigen::Index Index
Definition ComplexEigenSolver.h:66
Performs a complex Schur decomposition of a real or complex square matrix.
Definition ComplexSchur.h:60
std::conditional_t< internal::is_ref< MatrixType >::value, MatrixType, ComplexMatrixType > MatrixTType
Type of the matrix returned by matrixT().
Definition ComplexSchur.h:96
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:188
ComputationInfo
Definition Constants.h:455
@ Success
Definition Constants.h:457
@ RowMajor
Definition Constants.h:321
Definition EigenBase.h:34