簡體   English   中英

如何將 std::vector 轉換為 Eigen 中的矩陣?

[英]How to convert an std::vector to a matrix in Eigen?

我對 Stack Overflow 和 C++ 有點陌生,所以請隨時糾正我的代碼中的任何錯誤和這個問題的格式。

我正在嘗試使用涉及矩陣轉置和向量(及其逆)乘法的正規方程制作線性回歸計算器。 該程序應該從 csv 文件中讀取並將該文件中的信息傳遞到矩陣中並計算回歸線。 為了簡化工作,我決定使用一個名為 Eigen 的庫來進行矩陣-矩陣乘法。

我遇到的問題是Map function 只能接受數組而不是 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 function 是我從向量中創建數組的不成功嘗試(老實說,它可以工作,但它返回一個指針,您不能將其傳遞到 Eigen 中的Map function。) calcLinReg確實像它聽起來的那樣:計算線性回歸線參數。

無論如何我可以將向量轉換為數組或將向量轉換為 Eigen 中的矩陣?

如何嘗試使用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);

或更短:

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

如果矢量超出范圍,則內存將被釋放,並且angeredVec的數據將處於混亂狀態。

評論中有人詢問動態行數和列數的情況。 這是可能的,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM