什么等于本征 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
#!/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