mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-09-26 00:03:14 +08:00
RealQZ: optimize general hessenberg to not apply rotations to zero entries.
This commit is contained in:
parent
c1cab7b8ed
commit
e7c07de549
@ -560,7 +560,7 @@ void EigenSolver<MatrixType>::doComputeEigenvectors()
|
|||||||
if ((vr == 0.0) && (vi == 0.0))
|
if ((vr == 0.0) && (vi == 0.0))
|
||||||
vr = eps * norm * (internal::abs(w) + internal::abs(q) + internal::abs(x) + internal::abs(y) + internal::abs(lastw));
|
vr = eps * norm * (internal::abs(w) + internal::abs(q) + internal::abs(x) + internal::abs(y) + internal::abs(lastw));
|
||||||
|
|
||||||
std::complex<Scalar> cc = cdiv(x*lastra-lastw*ra+q*sa,x*lastsa-lastw*sa-q*ra,vr,vi);
|
std::complex<Scalar> cc = cdiv(x*lastra-lastw*ra+q*sa,x*lastsa-lastw*sa-q*ra,vr,vi);
|
||||||
m_matT.coeffRef(i,n-1) = internal::real(cc);
|
m_matT.coeffRef(i,n-1) = internal::real(cc);
|
||||||
m_matT.coeffRef(i,n) = internal::imag(cc);
|
m_matT.coeffRef(i,n) = internal::imag(cc);
|
||||||
if (internal::abs(x) > (internal::abs(lastw) + internal::abs(q)))
|
if (internal::abs(x) > (internal::abs(lastw) + internal::abs(q)))
|
||||||
|
@ -234,18 +234,26 @@ namespace Eigen {
|
|||||||
for (Index i=dim-1; i>=j+2; i--) {
|
for (Index i=dim-1; i>=j+2; i--) {
|
||||||
JRs G;
|
JRs G;
|
||||||
// kill S(i,j)
|
// kill S(i,j)
|
||||||
G.makeGivens(m_S.coeff(i-1, j), m_S.coeff(i,j));
|
if(m_S.coeff(i,j) != 0)
|
||||||
m_S.applyOnTheLeft(i-1,i,G.adjoint());
|
{
|
||||||
m_T.applyOnTheLeft(i-1,i,G.adjoint());
|
Scalar tmp = m_S(i-1,j);
|
||||||
m_S.coeffRef(i,j) = Scalar(0.0);
|
G.makeGivens(tmp, m_S.coeff(i,j), &m_S.coeffRef(i-1, j));
|
||||||
|
m_S.coeffRef(i,j) = Scalar(0.0);
|
||||||
|
m_S.rightCols(dim-j-1).applyOnTheLeft(i-1,i,G.adjoint());
|
||||||
|
m_T.rightCols(dim-i+1).applyOnTheLeft(i-1,i,G.adjoint());
|
||||||
|
}
|
||||||
// update Q
|
// update Q
|
||||||
if (m_computeQZ)
|
if (m_computeQZ)
|
||||||
m_Q.applyOnTheRight(i-1,i,G);
|
m_Q.applyOnTheRight(i-1,i,G);
|
||||||
// kill T(i,i-1)
|
// kill T(i,i-1)
|
||||||
G.makeGivens(m_T.coeff(i,i), m_T.coeff(i,i-1));
|
if(m_T.coeff(i,i-1)!=Scalar(0))
|
||||||
m_S.applyOnTheRight(i,i-1,G);
|
{
|
||||||
m_T.applyOnTheRight(i,i-1,G);
|
Scalar tmp = m_T.coeff(i,i);
|
||||||
m_T.coeffRef(i,i-1) = Scalar(0.0);
|
G.makeGivens(tmp, m_T.coeff(i,i-1), &m_T.coeffRef(i,i));
|
||||||
|
m_T.coeffRef(i,i-1) = Scalar(0.0);
|
||||||
|
m_S.applyOnTheRight(i,i-1,G);
|
||||||
|
m_T.topRows(i).applyOnTheRight(i,i-1,G);
|
||||||
|
}
|
||||||
// update Z
|
// update Z
|
||||||
if (m_computeQZ)
|
if (m_computeQZ)
|
||||||
m_Z.applyOnTheLeft(i,i-1,G.adjoint());
|
m_Z.applyOnTheLeft(i,i-1,G.adjoint());
|
||||||
@ -574,4 +582,3 @@ namespace Eigen {
|
|||||||
|
|
||||||
|
|
||||||
#endif //EIGEN_REAL_QZ
|
#endif //EIGEN_REAL_QZ
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user