如何将std :: vector转换为Eigen中的矩阵?

Ike*_*ude 2 c++ vector matrix eigen c++11

我对Stack Overflow和C ++有点陌生,所以可以随时纠正我的代码中的所有错误以及此问题的格式。

我正在尝试使用包含矩阵的转置和向量(及其逆)乘法的法线方程制作线性回归计算器。该程序应该从csv文件中读取并将该文件中的信息传递到矩阵中并计算回归线。为了简化工作,我决定使用一个名为Eigen的库进行矩阵矩阵乘法。

我遇到的问题是该Map函数只能接受一个数组,而不是std :: vector。

这是我到目前为止的内容:

float feature_data[] = { 1, 1, 1, 1, 1, 1,
                         2, 4.5, 3, 1,4, 5};
float labels[] = { 1, 4, 3, 2, 5, 7 };


//maps the array to a matrix called "feature_data"
MatrixXf mFeatures = Map< Matrix<float, 6, 2> >(feature_data);
MatrixXf mLabels = Map< Matrix<float, 6, 1> >(labels);

//use the toArray function
std::vector<float> test_vector = { 2,1,3 };
float* test_array = toArray(test_vector);


calcLinReg(mFeatures, mLabels);

const int n = 2;
int arr[n];

system("pause");
Run Code Online (Sandbox Code Playgroud)

对于上下文,toArray函数是我从向量创建数组的一次失败尝试(老实说,它可以工作,但它返回的指针您不能传递给MapEigen中的函数。)calcLinReg确实听起来像:计算线性回归线参数。

无论如何,我可以在Eigen中将向量转换为数组或将向量转换为矩阵?

use*_*999 5

如何尝试使用vectors data()方法,该方法使您可以访问vector内部使用的内存数组,如下所示:

    std::vector<float> test_vector = { 2,1,3 };
    float* test_array = test_vector.data();
    Eigen::MatrixXf test = Eigen::Map<Eigen::Matrix<float, 3, 1> >(test_array);
Run Code Online (Sandbox Code Playgroud)

或更短:

    std::vector<float> test_vector = { 2,1,3 };
    Eigen::MatrixXf test = Eigen::Map<Eigen::Matrix<float, 3, 1> >(test_vector.data());
Run Code Online (Sandbox Code Playgroud)

当心指点实际上是复制数据,因此这是安全的。但是,您也可以像这样直接使用向量的数据

    std::vector<float> test_vector(3,2);
    Eigen::Map<Eigen::Matrix<float, 3, 1> > dangerousVec (test_vector.data());
Run Code Online (Sandbox Code Playgroud)

如果矢量超出范围,则内存将被释放,并且angeredVec的数据将处于混乱状态。


Sté*_*ent 5

评论中有人询问动态行数和列数的情况。这是可能的,如下所示:

typedef Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> MyMatrix;

size_t nrow = ...;
size_t ncol = ...;
MyMatrix M = Eigen::Map<MyMatrix>(test_vector.data(), nrow, ncol);
Run Code Online (Sandbox Code Playgroud)