Eigen求解特征值时如何将结果正确赋值给double类型变量
Eigen特征值赋值给普通数值变量的实现方法
类型报错的核心原因
Eigen的EigenSolver输出的特征值不是原生的double/float,而是std::complex类型——类型精度和你输入的矩阵元素精度一致,比如输入double型矩阵,输出特征值的类型就是std::complex<double>。网上大部分入门示例都只演示用cout直接打印这个复数类型,没提怎么转成原生数值再赋值,直接把复数对象赋值给普通double变量就会触发难以定位的类型转换报错。
正确操作逻辑
- 先按照输入矩阵的精度定义对应的复数变量,接收
eigenvalues()返回的元素 - 需要实部就调用
.real(),需要虚部就调用.imag(),拿到原生浮点值后再赋值给自定义的double/float变量 - 不要直接把
std::complex类型的对象赋值给普通浮点变量,这是这类报错最常见的来源。
优化后的可运行代码
// 按照需求定义double型变量存储特征值实部 double E = 0; // 定义2x2 double型系数矩阵 Eigen::Matrix<double, 2, 2> A; A(0,0) = 1.0; A(0,1) = 2.0; A(1,0) = 1.0; A(1,1) = 4.0; // 初始化特征值求解器,传入待求解矩阵 Eigen::EigenSolver<Eigen::Matrix<double, 2, 2>> s(A); // 第二个参数传false表示仅计算特征值,无需计算特征向量,可减少开销 s.compute(A, false); // 接收第0个特征值,类型和矩阵精度匹配为std::complex<double> std::complex<double> lambda = s.eigenvalues()[0]; // 取实部赋值给E,无额外类型转换开销 E = lambda.real();
补充说明:之前的临时可运行代码里把lambda定义成
complex<float>属于隐式降级转换,会损失double精度,建议复数变量的类型和输入矩阵的元素精度保持一致,避免不必要的精度丢失。
额外提醒:不要尝试将eigenvalues()的返回结果直接转成Eigen::VectorXd类型,这个返回值本质是Eigen::VectorXcd(复数double型向量),如果需要批量存储所有特征值的实部,需要手动遍历元素逐个取.real()赋值。
内容的提问来源于stack exchange,提问作者Nicktw
相关产品推荐
相关产品推荐

