mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-16 21:55:58 +08:00
RealSchur: Use PlanarRotation in "found two real eigenvalues" branch.
This commit is contained in:
parent
d88d1cfa62
commit
dad50338b8
@ -186,37 +186,11 @@ void RealSchur<MatrixType>::hqr2()
|
|||||||
m_eivalues.coeffRef(n-1) = ComplexScalar(x + z, 0.0);
|
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);
|
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);
|
PlanarRotation<Scalar> rot;
|
||||||
s = ei_abs(x) + ei_abs(z);
|
rot.makeGivens(z, m_matT.coeff(n, n-1));
|
||||||
p = x / s;
|
m_matT.block(0, n-1, size, size-n+1).applyOnTheLeft(n-1, n, rot.adjoint());
|
||||||
q = z / s;
|
m_matT.block(0, 0, n+1, size).applyOnTheRight(n-1, n, rot);
|
||||||
r = ei_sqrt(p * p+q * q);
|
m_matU.applyOnTheRight(n-1, n, rot);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else // Complex pair
|
else // Complex pair
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user