寻求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
相关产品推荐
相关产品推荐

