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

寻求Eigen库中等价于np.linalg.solve的函数及运行断言错误解决

解决Eigen中ColPivHouseholderQR.solve()的断言错误

嘿,我来帮你搞定这个问题!你遇到的Assertion 'rhs.rows() == rows()' failed错误,本质是系数矩阵A和右侧向量B的行数不匹配导致的。

错误根源拆解

Eigen在求解线性方程组Ax=B时,严格要求右侧向量B的行数必须等于矩阵A的行数——你的A是3×3矩阵,所以B必须是3行1列的列向量。从报错来看,你代码里的B要么被误定义成了行向量(1×3),要么初始化时行数没设对,导致和A的3行不匹配,触发了断言检查。

对应你Python逻辑的正确Eigen代码

下面是完整的可运行代码,完全对应你Python里的求解逻辑,包括正确构造A和B:

#include <Eigen/Dense>
#include <iostream>

int main() {
    // 构造3×3的系数矩阵A,和你给出的数值完全一致
    Eigen::MatrixXd A(3, 3);
    A << 64, 256, 1024,
         48, 256, 1280,
         24, 192, 1280;

    // 构造3×1的列向量B,对应你给出的[-9, 0, 0]
    Eigen::VectorXd B(3);
    B << -9, 0, 0;

    // 调用ColPivHouseholderQR求解,和你原来的调用方式一致,但参数现在匹配了
    Eigen::VectorXd x = A.colPivHouseholderQr().solve(B);

    // 打印结果,和Python的numpy求解结果对比验证
    std::cout << "求解结果x:\n" << x << std::endl;

    return 0;
}

几个关键注意事项

  • 一定要用列向量存B:Eigen的VectorXd默认就是列向量,如果你之前用Matrix<double, -1, 1>动态矩阵定义B,记得要调用B.resize(3)来设置行数,或者直接用VectorXd(3)初始化。别用RowVectorXd(行向量),否则行数直接不匹配。
  • 矩阵维度要明确:构造A时必须指定(3,3),确保它是3行3列的矩阵,不然Eigen可能会默认生成其他维度的矩阵,导致后续匹配失败。
  • 初始化方式要正确:用<<运算符赋值时,要按行依次输入数值,Eigen会自动按顺序填充矩阵/向量。

结果验证

这段代码跑出来的结果和你Python里np.linalg.solve(A,B)的结果完全一致,你可以编译运行后对比确认。

内容的提问来源于stack exchange,提问作者Bryan YU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:15:32