aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Eigenvalues/RealQZ.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2012-07-24 18:16:22 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2012-07-24 18:16:22 +0200
commite7c07de549ace45f11c000c15f6a9fcb1c9b8170 (patch)
tree4e9b5180cc7de5b5f94072e6ec699ec3c2e5bb06 /Eigen/src/Eigenvalues/RealQZ.h
parentc1cab7b8ed8e419f88c167d67167f8dc485fc1e9 (diff)
RealQZ: optimize general hessenberg to not apply rotations to zero entries.
Diffstat (limited to 'Eigen/src/Eigenvalues/RealQZ.h')
-rw-r--r--Eigen/src/Eigenvalues/RealQZ.h25
1 files changed, 16 insertions, 9 deletions
diff --git a/Eigen/src/Eigenvalues/RealQZ.h b/Eigen/src/Eigenvalues/RealQZ.h
index 684b6878c..8c7adb63d 100644
--- a/Eigen/src/Eigenvalues/RealQZ.h
+++ b/Eigen/src/Eigenvalues/RealQZ.h
@@ -234,18 +234,26 @@ namespace Eigen {
for (Index i=dim-1; i>=j+2; i--) {
JRs G;
// kill S(i,j)
- G.makeGivens(m_S.coeff(i-1, j), m_S.coeff(i,j));
- m_S.applyOnTheLeft(i-1,i,G.adjoint());
- m_T.applyOnTheLeft(i-1,i,G.adjoint());
- m_S.coeffRef(i,j) = Scalar(0.0);
+ if(m_S.coeff(i,j) != 0)
+ {
+ Scalar tmp = m_S(i-1,j);
+ 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
if (m_computeQZ)
m_Q.applyOnTheRight(i-1,i,G);
// kill T(i,i-1)
- G.makeGivens(m_T.coeff(i,i), m_T.coeff(i,i-1));
- m_S.applyOnTheRight(i,i-1,G);
- m_T.applyOnTheRight(i,i-1,G);
- m_T.coeffRef(i,i-1) = Scalar(0.0);
+ if(m_T.coeff(i,i-1)!=Scalar(0))
+ {
+ Scalar tmp = m_T.coeff(i,i);
+ 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
if (m_computeQZ)
m_Z.applyOnTheLeft(i,i-1,G.adjoint());
@@ -574,4 +582,3 @@ namespace Eigen {
#endif //EIGEN_REAL_QZ
-