Medial Code Documentation
Loading...
Searching...
No Matches
GeneralizedEigenSolver.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud@inria.fr>
5// Copyright (C) 2010,2012 Jitse Niesen <jitse@maths.leeds.ac.uk>
6//
7// This Source Code Form is subject to the terms of the Mozilla
8// Public License v. 2.0. If a copy of the MPL was not distributed
9// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
11#ifndef EIGEN_GENERALIZEDEIGENSOLVER_H
12#define EIGEN_GENERALIZEDEIGENSOLVER_H
13
14#include "./RealQZ.h"
15
16namespace Eigen {
17
57template<typename _MatrixType> class GeneralizedEigenSolver
58{
59 public:
60
62 typedef _MatrixType MatrixType;
63
64 enum {
65 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
66 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
67 Options = MatrixType::Options,
68 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
69 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
70 };
71
73 typedef typename MatrixType::Scalar Scalar;
74 typedef typename NumTraits<Scalar>::Real RealScalar;
75 typedef Eigen::Index Index;
76
83 typedef std::complex<RealScalar> ComplexScalar;
84
91
98
102
109
117 GeneralizedEigenSolver() : m_eivec(), m_alphas(), m_betas(), m_isInitialized(false), m_realQZ(), m_matS(), m_tmp() {}
118
126 : m_eivec(size, size),
127 m_alphas(size),
128 m_betas(size),
129 m_isInitialized(false),
130 m_eigenvectorsOk(false),
131 m_realQZ(size),
132 m_matS(size, size),
133 m_tmp(size)
134 {}
135
149 : m_eivec(A.rows(), A.cols()),
150 m_alphas(A.cols()),
151 m_betas(A.cols()),
152 m_isInitialized(false),
153 m_eigenvectorsOk(false),
154 m_realQZ(A.cols()),
155 m_matS(A.rows(), A.cols()),
156 m_tmp(A.cols())
157 {
159 }
160
161 /* \brief Returns the computed generalized eigenvectors.
162 *
163 * \returns %Matrix whose columns are the (possibly complex) eigenvectors.
164 *
165 * \pre Either the constructor
166 * GeneralizedEigenSolver(const MatrixType&,const MatrixType&, bool) or the member function
167 * compute(const MatrixType&, const MatrixType& bool) has been called before, and
168 * \p computeEigenvectors was set to true (the default).
169 *
170 * Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
171 * to eigenvalue number \f$ k \f$ as returned by eigenvalues(). The
172 * eigenvectors are normalized to have (Euclidean) norm equal to one. The
173 * matrix returned by this function is the matrix \f$ V \f$ in the
174 * generalized eigendecomposition \f$ A = B V D V^{-1} \f$, if it exists.
175 *
176 * \sa eigenvalues()
177 */
178// EigenvectorsType eigenvectors() const;
179
199 {
200 eigen_assert(m_isInitialized && "GeneralizedEigenSolver is not initialized.");
201 return EigenvalueType(m_alphas,m_betas);
202 }
203
210 {
211 eigen_assert(m_isInitialized && "GeneralizedEigenSolver is not initialized.");
212 return m_alphas;
213 }
214
221 {
222 eigen_assert(m_isInitialized && "GeneralizedEigenSolver is not initialized.");
223 return m_betas;
224 }
225
250
251 ComputationInfo info() const
252 {
253 eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
254 return m_realQZ.info();
255 }
256
260 {
261 m_realQZ.setMaxIterations(maxIters);
262 return *this;
263 }
264
265 protected:
266
267 static void check_template_parameters()
268 {
269 EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
270 EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL);
271 }
272
273 MatrixType m_eivec;
274 ComplexVectorType m_alphas;
275 VectorType m_betas;
276 bool m_isInitialized;
277 bool m_eigenvectorsOk;
278 RealQZ<MatrixType> m_realQZ;
279 MatrixType m_matS;
280
282 ColumnVectorType m_tmp;
283};
284
285//template<typename MatrixType>
286//typename GeneralizedEigenSolver<MatrixType>::EigenvectorsType GeneralizedEigenSolver<MatrixType>::eigenvectors() const
287//{
288// eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
289// eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
290// Index n = m_eivec.cols();
291// EigenvectorsType matV(n,n);
292// // TODO
293// return matV;
294//}
295
296template<typename MatrixType>
297GeneralizedEigenSolver<MatrixType>&
299{
300 check_template_parameters();
301
302 using std::sqrt;
303 using std::abs;
304 eigen_assert(A.cols() == A.rows() && B.cols() == A.rows() && B.cols() == B.rows());
305
306 // Reduce to generalized real Schur form:
307 // A = Q S Z and B = Q T Z
308 m_realQZ.compute(A, B, computeEigenvectors);
309
310 if (m_realQZ.info() == Success)
311 {
312 m_matS = m_realQZ.matrixS();
314 m_eivec = m_realQZ.matrixZ().transpose();
315
316 // Compute eigenvalues from matS
317 m_alphas.resize(A.cols());
318 m_betas.resize(A.cols());
319 Index i = 0;
320 while (i < A.cols())
321 {
322 if (i == A.cols() - 1 || m_matS.coeff(i+1, i) == Scalar(0))
323 {
324 m_alphas.coeffRef(i) = m_matS.coeff(i, i);
325 m_betas.coeffRef(i) = m_realQZ.matrixT().coeff(i,i);
326 ++i;
327 }
328 else
329 {
330 Scalar p = Scalar(0.5) * (m_matS.coeff(i, i) - m_matS.coeff(i+1, i+1));
331 Scalar z = sqrt(abs(p * p + m_matS.coeff(i+1, i) * m_matS.coeff(i, i+1)));
332 m_alphas.coeffRef(i) = ComplexScalar(m_matS.coeff(i+1, i+1) + p, z);
333 m_alphas.coeffRef(i+1) = ComplexScalar(m_matS.coeff(i+1, i+1) + p, -z);
334
335 m_betas.coeffRef(i) = m_realQZ.matrixT().coeff(i,i);
336 m_betas.coeffRef(i+1) = m_realQZ.matrixT().coeff(i,i);
337 i += 2;
338 }
339 }
340 }
341
342 m_isInitialized = true;
343 m_eigenvectorsOk = false;//computeEigenvectors;
344
345 return *this;
346}
347
348} // end namespace Eigen
349
350#endif // EIGEN_GENERALIZEDEIGENSOLVER_H
\eigenvalues_module
Definition GeneralizedEigenSolver.h:58
GeneralizedEigenSolver & compute(const MatrixType &A, const MatrixType &B, bool computeEigenvectors=true)
Computes generalized eigendecomposition of given matrix.
Definition GeneralizedEigenSolver.h:298
GeneralizedEigenSolver(const MatrixType &A, const MatrixType &B, bool computeEigenvectors=true)
Constructor; computes the generalized eigendecomposition of given matrix pair.
Definition GeneralizedEigenSolver.h:148
GeneralizedEigenSolver & setMaxIterations(Index maxIters)
Sets the maximal number of iterations allowed.
Definition GeneralizedEigenSolver.h:259
Eigen::Index Index
Definition GeneralizedEigenSolver.h:75
_MatrixType MatrixType
Synonym for the template parameter _MatrixType.
Definition GeneralizedEigenSolver.h:62
Matrix< Scalar, ColsAtCompileTime, 1, Options &~RowMajor, MaxColsAtCompileTime, 1 > VectorType
Type for vector of real scalar values eigenvalues as returned by betas().
Definition GeneralizedEigenSolver.h:90
EigenvalueType eigenvalues() const
Returns an expression of the computed generalized eigenvalues.
Definition GeneralizedEigenSolver.h:198
ComplexVectorType alphas() const
Definition GeneralizedEigenSolver.h:209
GeneralizedEigenSolver(Index size)
Default constructor with memory preallocation.
Definition GeneralizedEigenSolver.h:125
std::complex< RealScalar > ComplexScalar
Complex scalar type for MatrixType.
Definition GeneralizedEigenSolver.h:83
VectorType betas() const
Definition GeneralizedEigenSolver.h:220
Matrix< ComplexScalar, ColsAtCompileTime, 1, Options &~RowMajor, MaxColsAtCompileTime, 1 > ComplexVectorType
Type for vector of complex scalar values eigenvalues as returned by betas().
Definition GeneralizedEigenSolver.h:97
CwiseBinaryOp< internal::scalar_quotient_op< ComplexScalar, Scalar >, ComplexVectorType, VectorType > EigenvalueType
Expression type for the eigenvalues as returned by eigenvalues().
Definition GeneralizedEigenSolver.h:101
GeneralizedEigenSolver()
Default constructor.
Definition GeneralizedEigenSolver.h:117
MatrixType::Scalar Scalar
Scalar type for matrices of type MatrixType.
Definition GeneralizedEigenSolver.h:73
Matrix< ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime > EigenvectorsType
Type for matrix of eigenvectors as returned by eigenvectors().
Definition GeneralizedEigenSolver.h:108
ComputationInfo info() const
Reports whether previous computation was successful.
Definition RealQZ.h:166
RealQZ & setMaxIterations(Index maxIters)
Sets the maximal number of iterations allowed to converge to one eigenvalue or decouple the problem.
Definition RealQZ.h:183
Pseudo expression representing a solving operation.
Definition Solve.h:63
ComputationInfo
Enum for reporting the status of a computation.
Definition Constants.h:430
@ Success
Computation was successful.
Definition Constants.h:432
Holds information about the various numeric (i.e.
Definition NumTraits.h:108
Definition inference.c:32