我正在尝试使用A的特征能力作为方形2D矢量来求解线性方程Ax = b。我将A和b分别作为基于C ++的2D矢量和1D矢量。但是,我找不到将它们的值传递给Eigen格式矩阵和向量的方法。你能告诉我如何以Eigen格式复制变量吗? 此外,在开始时应该包括哪些能够使用Map类作为可能的溶剂?! 这是代码:
#include <iostream>
#include <vector>
#include "Eigen/Dense"
using namespace std;
using namespace Eigen;
int main()
{
// Let's consider that the A and b are following CPP based vectors:
vector<vector<double>> mainA= { { 10.,11.,12. },{ 13.,14.,15. },{ 16.,17.,18. } };
vector<double> mainB = { 2.,5.,8. };
// ??? Here I need to do something to pass the values to the following Eigen
//format matrix and vector
MatrixXf A;
VectorXf b;
cout << "Here is the matrix A:\n" << A << endl;
cout << "Here is the vector b:\n" << b << endl;
Vector3f x = A.colPivHouseholderQr().solve(b);
cout << "The solution is:\n" << x << endl;
}
答案 0 :(得分:0)
如评论中所述,Eigen :: Map&lt;&gt;应该做的伎俩。
通常您不使用Unaligned
即可离开,但为了正确/稳定,最好使用它:
auto A = Eigen::Map<Eigen::MatrixXd, Eigen::Unaligned>(mainA.data(), mainA.size(), mainA[0].size())
auto b = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(mainB.data(), mainB.size());
Vector3d x = A.colPivHouseholderQr().solve(b);
回答下面关于健壮性的问题:这可以使用辅助函数来完成:
template <typename T, int Align>
Eigen::Map<Eigen::Matrix<T, -1, -1>, Align> CreateMatrix(const std::vector<std::vector<T>>& x)
{
int R = x.size();
assert(!x.empty());
int C = x[0].size();
#ifndef NDEBUG
for(int r=1; r < R; r++)
assert(x[r].size() == x[0].size());
#endif
return auto A = Eigen::Map<Eigen::Matrix<T,-1,-1>, Align>(x.data(), R, C);
}
虽然它看起来很冗长,但它会进行大量的健全性检查,然后您可以依赖于您进行单元测试的所有代码。