EIgen基本運算學習


本章學習鏈接:

  1. 使用C++ Eigen庫求解線性方程組Ax=b

向量

向量平方和

矩陣

動態矩陣

在使用動態矩陣的時候發現一個問題,在無法知道大小的時候直接初始化

int rows,cols;//從其他地方獲取的尺寸行列數
Eigen::MatrixXf tmp_mat;
tmp_mat=Eigen::Matrix<float,rows,cols>::Zero();

會報錯提示,初始化的時候必須使用const常量
這里的rows,cols必須使用常量,不能使用變量。
但是這個時候不知道應該是多少數值。所以可以如下使用:

int rows,cols;//從其他地方獲取的尺寸行列數
Eigen::MatrixXf tmp_mat;
tmp_mat=Eigen::Matrix<float,Dynamic,Dynamic>();
tmp_mat.resize(rows,cols);

對於大型矩陣 (一般行列超過32),考慮使用 dynamic,
定義方式如下:

Matrix<int, Dynamic, Dynamic> matrix_name (row_num,col_num);

如果沒有 (row_num,col_num)
會報錯:

Assertion `row >= 0 && row < rows() … failed.

如果矩陣的尺寸在編譯的時候是不確定的,而在運行的時候才能確定,Eigen提供了定義動態大小的方法。比如非常好用的:

typedef Matrix<double ,Dynamic,Dynamic > MatrixXd;  

MatrixXd定義了任意行數和列數的矩陣,可以在運行時確定。
類似地,對於向量有:

typedef Matrix<int ,Dynamic ,1> VectorXi ;

也可以對於一個維度確定,而指定另外一個維度是動態大小的。

Matrix<float,3,Dynamic> 矩陣的行數是 3,列數不確定。

隨機矩陣

使用Eigen庫和C++隨機數機制,產生正態分布的隨機矩陣
Eigen中只有產生均勻分布隨機矩陣的Random(),沒有其他分布類型的隨機矩陣函數。

借助Eigen提供的unaryExpr函數,可以對矩陣的每一個元素進行同一個操作。unaryExpr接受一個函數對象作為參數,該函數對象定義了所要對元素進行的運算。因此,我們只需要定一個產生隨機數的函數對象,將其作為參數傳給unaryExpr,即可對矩陣每一個元素產生隨機數。可以用lambda表達式作為函數對象,也可以定義一個函數,並用ptr_fun()函數將函數指針轉成函數對象。下面給出這兩種方式的實現。

QR分解

Eigen::Matrix<double,Eigen::Dynamic,1> x_qr(rows,1);
x_qr = A.colPivHouseholderQr().solve(b);
cout<<"original: x_qr:"<<endl<<x_qr<<endl;

Cholesky分解


四元數

Eigen中quaternion的構造函數為

Quaternion (const Scalar &w, const Scalar &x, const Scalar &y, const Scalar &z)

注意w在前。然而在內部存儲時eigen將四元數的w放在最后.
例如通過Eigen::Vector4d q = q_AB.coeffs();訪問時,q中的最后一個元素才是w。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM