将向量值传递给特征库格式

时间:2017-07-26 13:36:06

标签: c++ eigen

我正在尝试使用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;

}

1 个答案:

答案 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);
}

虽然它看起来很冗长,但它会进行大量的健全性检查,然后您可以依赖于您进行单元测试的所有代码。