如何在特征中将 std::vector 转换为矩阵?



我对堆栈溢出有点陌生,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完全符合其要求:计算线性回归线参数。

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

尝试使用 vectorsdata()方法怎么样,它使您可以访问向量内部使用的内存数组,如下所示:

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

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

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

如果矢量超出范围,则内存将被释放,并且危险的Vec的数据将挂起。

评论中的某人要求行和列的动态数量大小写。这是可能的,如下所示:

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

最新更新