aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen
diff options
context:
space:
mode:
authorGravatar Jitse Niesen <jitse@maths.leeds.ac.uk>2010-04-06 15:12:21 +0100
committerGravatar Jitse Niesen <jitse@maths.leeds.ac.uk>2010-04-06 15:12:21 +0100
commitdad50338b8d6419506ab7a332c755dec08f9de0d (patch)
tree749a2746479e1e66933dd3737a6cd4d7d941e282 /Eigen
parentd88d1cfa626dcc10ffb0ec53284bdc9f3bb991c7 (diff)
RealSchur: Use PlanarRotation in "found two real eigenvalues" branch.
Diffstat (limited to 'Eigen')
-rw-r--r--Eigen/src/Eigenvalues/RealSchur.h36
1 files changed, 5 insertions, 31 deletions
diff --git a/Eigen/src/Eigenvalues/RealSchur.h b/Eigen/src/Eigenvalues/RealSchur.h
index 395b80089..8650a2456 100644
--- a/Eigen/src/Eigenvalues/RealSchur.h
+++ b/Eigen/src/Eigenvalues/RealSchur.h
@@ -186,37 +186,11 @@ void RealSchur<MatrixType>::hqr2()
m_eivalues.coeffRef(n-1) = ComplexScalar(x + z, 0.0);
m_eivalues.coeffRef(n) = ComplexScalar(z!=0.0 ? x - w / z : m_eivalues.coeff(n-1).real(), 0.0);
- x = m_matT.coeff(n,n-1);
- s = ei_abs(x) + ei_abs(z);
- p = x / s;
- q = z / s;
- r = ei_sqrt(p * p+q * q);
- p = p / r;
- q = q / r;
-
- // Row modification
- for (int j = n-1; j < size; ++j)
- {
- z = m_matT.coeff(n-1,j);
- m_matT.coeffRef(n-1,j) = q * z + p * m_matT.coeff(n,j);
- m_matT.coeffRef(n,j) = q * m_matT.coeff(n,j) - p * z;
- }
-
- // Column modification
- for (int i = 0; i <= n; ++i)
- {
- z = m_matT.coeff(i,n-1);
- m_matT.coeffRef(i,n-1) = q * z + p * m_matT.coeff(i,n);
- m_matT.coeffRef(i,n) = q * m_matT.coeff(i,n) - p * z;
- }
-
- // Accumulate transformations
- for (int i = low; i <= high; ++i)
- {
- z = m_matU.coeff(i,n-1);
- m_matU.coeffRef(i,n-1) = q * z + p * m_matU.coeff(i,n);
- m_matU.coeffRef(i,n) = q * m_matU.coeff(i,n) - p * z;
- }
+ PlanarRotation<Scalar> rot;
+ rot.makeGivens(z, m_matT.coeff(n, n-1));
+ m_matT.block(0, n-1, size, size-n+1).applyOnTheLeft(n-1, n, rot.adjoint());
+ m_matT.block(0, 0, n+1, size).applyOnTheRight(n-1, n, rot);
+ m_matU.applyOnTheRight(n-1, n, rot);
}
else // Complex pair
{