mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-12 08:01:49 +08:00
Fix GeneralizedEigenSolver when requesting for eigenvalues only.
(grafted from a87cff20df5129c364c4675f05ceb6d451188f6c )
This commit is contained in:
parent
ae6e5caa40
commit
ab3fa2e123
@ -311,7 +311,6 @@ GeneralizedEigenSolver<MatrixType>::compute(const MatrixType& A, const MatrixTyp
|
|||||||
// Aliases:
|
// Aliases:
|
||||||
Map<VectorType> v(reinterpret_cast<Scalar*>(m_tmp.data()), size);
|
Map<VectorType> v(reinterpret_cast<Scalar*>(m_tmp.data()), size);
|
||||||
ComplexVectorType &cv = m_tmp;
|
ComplexVectorType &cv = m_tmp;
|
||||||
const MatrixType &mZ = m_realQZ.matrixZ();
|
|
||||||
const MatrixType &mS = m_realQZ.matrixS();
|
const MatrixType &mS = m_realQZ.matrixS();
|
||||||
const MatrixType &mT = m_realQZ.matrixT();
|
const MatrixType &mT = m_realQZ.matrixT();
|
||||||
|
|
||||||
@ -351,7 +350,7 @@ GeneralizedEigenSolver<MatrixType>::compute(const MatrixType& A, const MatrixTyp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_eivec.col(i).real().noalias() = mZ.transpose() * v;
|
m_eivec.col(i).real().noalias() = m_realQZ.matrixZ().transpose() * v;
|
||||||
m_eivec.col(i).real().normalize();
|
m_eivec.col(i).real().normalize();
|
||||||
m_eivec.col(i).imag().setConstant(0);
|
m_eivec.col(i).imag().setConstant(0);
|
||||||
}
|
}
|
||||||
@ -400,7 +399,7 @@ GeneralizedEigenSolver<MatrixType>::compute(const MatrixType& A, const MatrixTyp
|
|||||||
/ (alpha*mT.coeffRef(j,j) - static_cast<Scalar>(beta*mS.coeffRef(j,j)));
|
/ (alpha*mT.coeffRef(j,j) - static_cast<Scalar>(beta*mS.coeffRef(j,j)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_eivec.col(i+1).noalias() = (mZ.transpose() * cv);
|
m_eivec.col(i+1).noalias() = (m_realQZ.matrixZ().transpose() * cv);
|
||||||
m_eivec.col(i+1).normalize();
|
m_eivec.col(i+1).normalize();
|
||||||
m_eivec.col(i) = m_eivec.col(i+1).conjugate();
|
m_eivec.col(i) = m_eivec.col(i+1).conjugate();
|
||||||
}
|
}
|
||||||
|
@ -77,6 +77,13 @@ template<typename MatrixType> void generalized_eigensolver_real(const MatrixType
|
|||||||
GeneralizedEigenSolver<MatrixType> eig2(a.adjoint() * a,b.adjoint() * b);
|
GeneralizedEigenSolver<MatrixType> eig2(a.adjoint() * a,b.adjoint() * b);
|
||||||
eig2.compute(a.adjoint() * a,b.adjoint() * b);
|
eig2.compute(a.adjoint() * a,b.adjoint() * b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check without eigenvectors
|
||||||
|
{
|
||||||
|
GeneralizedEigenSolver<MatrixType> eig1(spdA, spdB, true);
|
||||||
|
GeneralizedEigenSolver<MatrixType> eig2(spdA, spdB, false);
|
||||||
|
VERIFY_IS_APPROX(eig1.eigenvalues(), eig2.eigenvalues());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_eigensolver_generalized_real()
|
void test_eigensolver_generalized_real()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user