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

5
我有些新手在使用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");

为了更好的理解,toArray函数是我尝试将向量转换为数组的不成功之举(老实说,它确实可以工作,但它返回一个指针,无法传递到Eigen中的Map函数)。 calcLinReg 的功能就像它听起来的那样:计算线性回归直线参数。

有没有办法将向量转换为数组或在Eigen中将向量转换为矩阵?

2个回答

8
试试使用向量data()方法,该方法允许您访问向量内部使用的内存数组,例如:

    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);

或者更简洁:

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

注意,这个赋值操作实际上是复制了数据,因此是安全的。不过,你也可以直接像下面这样使用 vector 的数据:

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

如果向量超出范围,内存将被释放,而dangerousVec的数据则会变得无效。

这似乎很好用,但我没想到 Map 函数可以接受指针。 - Ikechukwu Anude
1
如果行数和列数是动态的,我们要如何实现呢?例如,像这样的东西:Eigen::Map<Eigen::Matrix<float, sqrt(test_vector.size()), sqrt(test_vector.size())>>。但是这段代码不能编译。 - Amir Rasti

4

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

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接