11 #ifndef EIGEN_GENERALIZEDEIGENSOLVER_H
12 #define EIGEN_GENERALIZEDEIGENSOLVER_H
65 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
66 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
67 Options = MatrixType::Options,
68 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
69 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
73 typedef typename MatrixType::Scalar
Scalar;
75 typedef typename MatrixType::Index Index;
126 : m_eivec(size, size),
129 m_isInitialized(false),
130 m_eigenvectorsOk(false),
149 : m_eivec(A.rows(), A.cols()),
152 m_isInitialized(false),
153 m_eigenvectorsOk(false),
155 m_matS(A.rows(), A.cols()),
158 compute(A, B, computeEigenvectors);
200 eigen_assert(m_isInitialized &&
"GeneralizedEigenSolver is not initialized.");
211 eigen_assert(m_isInitialized &&
"GeneralizedEigenSolver is not initialized.");
222 eigen_assert(m_isInitialized &&
"GeneralizedEigenSolver is not initialized.");
253 eigen_assert(m_isInitialized &&
"EigenSolver is not initialized.");
254 return m_realQZ.
info();
269 bool m_isInitialized;
270 bool m_eigenvectorsOk;
275 ColumnVectorType m_tmp;
289 template<
typename MatrixType>
290 GeneralizedEigenSolver<MatrixType>&
295 eigen_assert(A.cols() == A.rows() && B.cols() == A.rows() && B.cols() == B.rows());
299 m_realQZ.compute(A, B, computeEigenvectors);
301 if (m_realQZ.info() ==
Success)
303 m_matS = m_realQZ.matrixS();
304 if (computeEigenvectors)
305 m_eivec = m_realQZ.matrixZ().transpose();
308 m_alphas.resize(A.cols());
309 m_betas.resize(A.cols());
313 if (i == A.cols() - 1 || m_matS.coeff(i+1, i) ==
Scalar(0))
315 m_alphas.coeffRef(i) = m_matS.coeff(i, i);
316 m_betas.coeffRef(i) = m_realQZ.matrixT().coeff(i,i);
321 Scalar p =
Scalar(0.5) * (m_matS.coeff(i, i) - m_matS.coeff(i+1, i+1));
322 Scalar z = sqrt(abs(p * p + m_matS.coeff(i+1, i) * m_matS.coeff(i, i+1)));
323 m_alphas.coeffRef(i) =
ComplexScalar(m_matS.coeff(i+1, i+1) + p, z);
324 m_alphas.coeffRef(i+1) =
ComplexScalar(m_matS.coeff(i+1, i+1) + p, -z);
326 m_betas.coeffRef(i) = m_realQZ.matrixT().coeff(i,i);
327 m_betas.coeffRef(i+1) = m_realQZ.matrixT().coeff(i,i);
333 m_isInitialized =
true;
334 m_eigenvectorsOk =
false;
341 #endif // EIGEN_GENERALIZEDEIGENSOLVER_H