如何用Eigen3求解矩阵方程A*x=B(避免显式求逆)
使用Eigen3求解矩阵方程A*x=B(A、B为N×N矩阵)
Eigen3的线性求解器天然支持将矩阵B作为右侧输入,无需额外拆分处理——本质是同时求解B的每一列对应的A*x_i = b_i(其中b_i是B的第i列,x_i是x的第i列),这种方式比显式计算inv(A)*B更高效、数值稳定性更好,完全符合官方文档的推荐。
核心实现思路
直接调用Eigen矩阵分解类的solve()方法,并将矩阵B作为参数传入即可。以下是几种常见场景的代码示例:
1. 通用可逆方阵:LU分解
适用于大多数非奇异方阵,是最常用的求解方式:
#include <Eigen/Dense> #include <iostream> int main() { const int N = 3; Eigen::MatrixXd A(N, N); Eigen::MatrixXd B(N, N); // 初始化示例矩阵A(确保可逆)和B A << 1, 2, 3, 4, 5, 6, 7, 8, 10; B << 1, 0, 0, 0, 1, 0, 0, 0, 1; // 此处B为单位阵,解x等价于A的逆,仅作验证用 // 执行LU分解并求解A*x = B Eigen::MatrixXd x = A.lu().solve(B); // 验证结果:A*x应近似等于B std::cout << "A*x:\n" << A * x << "\n\n"; std::cout << "x:\n" << x << std::endl; return 0; }
2. 对称正定矩阵:LLT分解
如果A是对称正定矩阵,使用LLT分解的计算效率更高、数值误差更小:
// 假设A是对称正定矩阵 Eigen::MatrixXd x = A.llt().solve(B);
3. 数值稳定性优先:QR分解
当矩阵A接近奇异或对数值稳定性要求极高时,可使用QR分解:
Eigen::MatrixXd x = A.qr().solve(B);
为什么不建议显式求逆?
显式计算A.inverse() * B会先单独计算逆矩阵,这个过程的数值误差比直接求解线性系统更大,且额外的矩阵乘法会增加计算量。而直接调用solve(B)时,Eigen会基于分解结果直接计算所有列的解,避免了逆矩阵的中间步骤,效率和稳定性都更优。
内容的提问来源于stack exchange,提问作者jwyan1126
相关产品推荐
相关产品推荐

