12#ifndef EIGEN_COMPLEX_EIGEN_SOLVER_H
13#define EIGEN_COMPLEX_EIGEN_SOLVER_H
15#include "./ComplexSchur.h"
53 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
54 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
55 Options = MatrixType::Options,
56 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
57 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
61 typedef typename MatrixType::Scalar
Scalar;
62 typedef typename NumTraits<Scalar>::Real RealScalar;
63 typedef typename MatrixType::Index Index;
96 m_isInitialized(false),
97 m_eigenvectorsOk(false),
108 : m_eivec(size, size),
111 m_isInitialized(false),
112 m_eigenvectorsOk(false),
126 : m_eivec(matrix.rows(),matrix.cols()),
127 m_eivalues(matrix.cols()),
128 m_schur(matrix.rows()),
129 m_isInitialized(false),
130 m_eigenvectorsOk(false),
131 m_matX(matrix.rows(),matrix.cols())
133 compute(matrix, computeEigenvectors);
158 eigen_assert(m_isInitialized &&
"ComplexEigenSolver is not initialized.");
159 eigen_assert(m_eigenvectorsOk &&
"The eigenvectors have not been computed together with the eigenvalues.");
183 eigen_assert(m_isInitialized &&
"ComplexEigenSolver is not initialized.");
219 eigen_assert(m_isInitialized &&
"ComplexEigenSolver is not initialized.");
220 return m_schur.info();
227 bool m_isInitialized;
228 bool m_eigenvectorsOk;
232 void doComputeEigenvectors(RealScalar matrixnorm);
233 void sortEigenvalues(
bool computeEigenvectors);
237template<
typename MatrixType>
241 assert(matrix.cols() == matrix.rows());
245 m_schur.compute(matrix, computeEigenvectors);
249 m_eivalues = m_schur.matrixT().diagonal();
250 if(computeEigenvectors)
251 doComputeEigenvectors(matrix.norm());
252 sortEigenvalues(computeEigenvectors);
255 m_isInitialized =
true;
256 m_eigenvectorsOk = computeEigenvectors;
261template<
typename MatrixType>
262void ComplexEigenSolver<MatrixType>::doComputeEigenvectors(RealScalar matrixnorm)
264 const Index n = m_eivalues.size();
268 m_matX = EigenvectorType::Zero(n, n);
269 for(Index k=n-1 ; k>=0 ; k--)
271 m_matX.coeffRef(k,k) = ComplexScalar(1.0,0.0);
273 for(Index i=k-1 ; i>=0 ; i--)
275 m_matX.coeffRef(i,k) = -m_schur.matrixT().coeff(i,k);
277 m_matX.coeffRef(i,k) -= (m_schur.matrixT().row(i).segment(i+1,k-i-1) * m_matX.col(k).segment(i+1,k-i-1)).value();
278 ComplexScalar z = m_schur.matrixT().coeff(i,i) - m_schur.matrixT().coeff(k,k);
279 if(z==ComplexScalar(0))
283 internal::real_ref(z) = NumTraits<RealScalar>::epsilon() * matrixnorm;
285 m_matX.coeffRef(i,k) = m_matX.coeff(i,k) / z;
290 m_eivec.noalias() = m_schur.matrixU() * m_matX;
292 for(Index k=0 ; k<n ; k++)
294 m_eivec.col(k).normalize();
299template<
typename MatrixType>
300void ComplexEigenSolver<MatrixType>::sortEigenvalues(
bool computeEigenvectors)
302 const Index n = m_eivalues.size();
303 for (Index i=0; i<n; i++)
306 m_eivalues.cwiseAbs().tail(n-i).minCoeff(&k);
310 std::swap(m_eivalues[k],m_eivalues[i]);
311 if(computeEigenvectors)
312 m_eivec.col(i).swap(m_eivec.col(k));
Computes eigenvalues and eigenvectors of general complex matrices.
Definition ComplexEigenSolver.h:46
std::complex< RealScalar > ComplexScalar
Complex scalar type for MatrixType.
Definition ComplexEigenSolver.h:71
Matrix< ComplexScalar, ColsAtCompileTime, 1, Options &(~RowMajor), MaxColsAtCompileTime, 1 > EigenvalueType
Type for vector of eigenvalues as returned by eigenvalues().
Definition ComplexEigenSolver.h:78
ComplexEigenSolver(Index size)
Default Constructor with memory preallocation.
Definition ComplexEigenSolver.h:107
MatrixType::Scalar Scalar
Scalar type for matrices of type MatrixType.
Definition ComplexEigenSolver.h:61
ComplexEigenSolver & compute(const MatrixType &matrix, bool computeEigenvectors=true)
Computes eigendecomposition of given matrix.
Definition ComplexEigenSolver.h:238
ComplexEigenSolver()
Default constructor.
Definition ComplexEigenSolver.h:92
const EigenvectorType & eigenvectors() const
Returns the eigenvectors of given matrix.
Definition ComplexEigenSolver.h:156
Matrix< ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime > EigenvectorType
Type for matrix of eigenvectors as returned by eigenvectors().
Definition ComplexEigenSolver.h:85
ComputationInfo info() const
Reports whether previous computation was successful.
Definition ComplexEigenSolver.h:217
_MatrixType MatrixType
Synonym for the template parameter _MatrixType.
Definition ComplexEigenSolver.h:50
ComplexEigenSolver(const MatrixType &matrix, bool computeEigenvectors=true)
Constructor; computes eigendecomposition of given matrix.
Definition ComplexEigenSolver.h:125
const EigenvalueType & eigenvalues() const
Returns the eigenvalues of given matrix.
Definition ComplexEigenSolver.h:181
Performs a complex Schur decomposition of a real or complex square matrix.
Definition ComplexSchur.h:52
The matrix class, also used for vectors and row-vectors.
Definition Matrix.h:129
ComputationInfo
Definition Constants.h:367
@ RowMajor
Definition Constants.h:259
@ Success
Definition Constants.h:369