如何将 std::vector 转换为 Eigen 中的矩阵?
How to convert an std::vector to a matrix in Eigen?
我对 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 函数是我尝试从向量创建数组的失败尝试(老实说,它可以工作,但它 returns 一个指针,您不能将其传递给 Map
Eigen 中的函数。) calcLinReg
的作用与听起来的完全一样:计算线性回归线参数。
在 Eigen 中有什么方法可以将向量转换为数组或将向量转换为矩阵?
尝试使用向量 data()
method 怎么样,它可以让您访问向量内部使用的内存数组,如下所示:
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 的数据是危险的。
我对 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 函数是我尝试从向量创建数组的失败尝试(老实说,它可以工作,但它 returns 一个指针,您不能将其传递给 Map
Eigen 中的函数。) calcLinReg
的作用与听起来的完全一样:计算线性回归线参数。
在 Eigen 中有什么方法可以将向量转换为数组或将向量转换为矩阵?
尝试使用向量 data()
method 怎么样,它可以让您访问向量内部使用的内存数组,如下所示:
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 的数据是危险的。