Eigen库GeneralizedEigenSolver断言错误原因及解决方法求助
广义特征值计算时Eigen库断言失败的问题解决
问题代码
我在使用Eigen库计算广义特征值时编写了以下代码:
Eigen::MatrixXcf get_Generalized_eigen(const Eigen::MatrixXf &A, const Eigen::MatrixXf &B){ Eigen::GeneralizedEigenSolver<Eigen::MatrixXf> ges; ges.compute(A, B); // cout << "The (complex) generalzied eigenvalues are (alphas./beta): " << ges.eigenvalues().transpose() << endl; cout << ges.eigenvalues().transpose(); }
触发的错误
运行后触发断言失败:
distance_matrix: /usr/include/eigen3/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h:204: Eigen::GeneralizedEigenSolver<_MatrixType>::EigenvalueType Eigen::GeneralizedEigenSolver<_MatrixType>::eigenvalues() const [with _MatrixType = Eigen::Matrix<float, -1, -1>; Eigen::GeneralizedEigenSolver<_MatrixType>::EigenvalueType = Eigen::CwiseBinaryOp<Eigen::internal::scalar_quotient_op<std::complex<float>, float>, Eigen::Matrix<std::complex<float>, -1, 1>, Eigen::Matrix<float, -1, 1> >]: Assertion `m_valuesOkay && "GeneralizedEigenSolver is not initialized."' failed. ./setup.sh: line 6: 3609 Aborted ./distance_matrix
错误原因
ges.compute(A, B)执行未成功,导致求解器未完成初始化,后续调用eigenvalues()触发断言检查。常见失败场景:- 矩阵A、B维度不匹配(广义特征值要求两者为同维度方阵)
- 矩阵B奇异(不可逆),而默认
compute方法依赖B可逆的前提 - float类型精度不足引发数值计算异常
- 原函数未返回声明的
Eigen::MatrixXcf类型值,存在未定义行为
修复方法
1. 验证输入矩阵合法性
在计算前检查矩阵维度是否符合要求:
if(A.rows() != A.cols() || B.rows() != B.cols() || A.rows() != B.rows()){ cerr << "错误:A和B必须是同维度的方阵" << endl; return Eigen::MatrixXcf(); }
2. 检查计算状态
通过compute的返回值判断计算是否成功:
Eigen::ComputationInfo info = ges.compute(A, B); if(info != Eigen::Success){ cerr << "特征值计算失败:"; if(info == Eigen::NumericalIssue) cerr << "出现数值计算问题"; else if(info == Eigen::NoConvergence) cerr << "算法未收敛"; else cerr << "输入无效"; cerr << endl; return Eigen::MatrixXcf(); }
3. 处理B奇异的情况
若B可能奇异,可尝试转换为标准特征值问题(前提是B正定):
Eigen::LLT<Eigen::MatrixXf> llt(B); if(llt.info() == Eigen::Success){ Eigen::MatrixXf A_transformed = llt.solve(A).adjoint(); Eigen::EigenSolver<Eigen::MatrixXf> es(A_transformed); return es.eigenvalues(); }
4. 补全函数返回值
修正原函数无返回值的问题:
Eigen::MatrixXcf get_Generalized_eigen(const Eigen::MatrixXf &A, const Eigen::MatrixXf &B){ // 先检查输入合法性 if(A.rows() != A.cols() || B.rows() != B.cols() || A.rows() != B.rows()){ cerr << "错误:A和B必须是同维度的方阵" << endl; return Eigen::MatrixXcf(); } Eigen::GeneralizedEigenSolver<Eigen::MatrixXf> ges; Eigen::ComputationInfo info = ges.compute(A, B); if(info != Eigen::Success){ cerr << "特征值计算失败" << endl; return Eigen::MatrixXcf(); } Eigen::MatrixXcf vals = ges.eigenvalues(); cout << vals.transpose() << endl; return vals; }
内容的提问来源于stack exchange,提问作者Song
相关产品推荐
相关产品推荐

