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

标签 c++ c++11 matrix vector eigen

我对 Stack Overflow 和 C++ 比较陌生,所以请随时纠正我的代码中的任何错误和这个问题的格式。

我正在尝试使用涉及矩阵转置和 vector (及其逆)乘法的正规方程制作线性回归计算器。该程序应该从 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 函数是我尝试从 vector 创建数组的失败尝试(老实说,它可以工作,但它返回一个指针,您不能将其传递给 Map 函数Eigen.) calcLinReg 确实如其名:计算线性回归线参数。

在 Eigen 中,是否可以将 vector 转换为数组或将 vector 转换为矩阵?

最佳答案

尝试使用 vector 如何 data() method ,这使您可以访问 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);

或更短:

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

如果 vector 超出范围,内存将被释放并且 dangerousVec 的数据是危险的。

关于c++ - 如何将 std::vector 转换为 Eigen 中的矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52261389/

相关文章:

c++ - 基于类型名称的 SFINAE

c++ - -lstdc++ 和 -lstdc++11 之间的区别

python - 如何缩放矩阵的每一列

matlab - x( :) and x(1:end) are different 的矩阵索引输出

matlab - Gauss-Jordan 消除法对 GF(2) 的消除

c++ - 使用 NativeMessaging 的 Chrome 扩展无法接收某种 json 数据

c++ - 根据另一个 vector 对点 vector 进行排序

c++ - 如何禁用 Openscenegraph 几何节点中的状态属性?

c++ 右值引用和 const 限定符

c++ - 快速随机字符串