本章學習鏈接:
向量
向量平方和
矩陣
動態矩陣
在使用動態矩陣的時候發現一個問題,在無法知道大小的時候直接初始化
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。