什么等于本征 C++ 中 Python 的 np.linalg.solve(A, B)

what is equal to np.linalg.solve(A, B) of Python in eigen C++

#!/usr/bin/python
x = np.linalg.solve(A, B)

上面可以计算出Ax = B的根,这里A是一个3×3的矩阵,B是一个3×1的向量。我想在 Eigen 库中找到一个具有 相同功能 的函数,而不是 Python Numpy 库。 结果 x 使用 Python Numpy linalg.solve() 是正确的。矩阵A和B如下图:

A: 
  64  256 1024
  48  256 1280
  24  192 1280
B: 
-9
 0
 0

但是,我选择了下面的代码(C++ Eigen)来解决同样的问题,错误显示给我。

// C++ with Eigen Library
auto x = A.colPivHouseholderQr().solve(B)

以上代码在运行时间出现错误:

frenet: /usr/include/eigen3/Eigen/src/QR/ColPivHouseholderQR.h:546: void
 Eigen::ColPivHouseholderQR<MatrixType>::_solve_impl(const RhsType&, 
DstType&) const [with RhsType = Eigen::Matrix<double, -1, 1>; DstType = 
Eigen::Matrix<double, -1, 1>; _MatrixType = Eigen::Matrix<double, -1,
 -1>]: Assertion `rhs.rows() == rows()' failed.

我不知道会发生什么。希望你能尽快帮助我!

如果在编译时已知 A 是 3x3,我建议直接计算逆函数(如果需要多次则只计算一次)

#include <Eigen/LU>
#include <iostream>

int main() {
  Eigen::Matrix3d A;
  A << 64, 256, 1024, 48, 256, 1280, 24, 192, 1280;
  Eigen::Vector3d B;
  B << -9.0, 0, 0;
  Eigen::Matrix3d A_inv = A.inverse();
  Eigen::Vector3d x = A_inv * B;

  std::cout << "solution x=\n" << x << "\n\nresidual A*x-B=\n" << A * x - B << '\n';
}

对于更大的 A,您需要选择 one of the decompositions 最适合您的问题。

此外,将 auto 与 Eigen 表达式一起使用时要非常小心:https://eigen.tuxfamily.org/dox-devel/TopicPitfalls.html#TopicPitfalls_auto_keyword