You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:27:17