Eigen有哪些需要注意的操作
Eigen有哪些需要注意的操作
- Eigen有哪些需要注意的操作
- 1. Eigen有哪些行操作,列操作,塊操作,怎樣寫會更高效?
- 2. ColMajor和RowMajor是什么?Eigen默認的是哪種?
- 3. noalias()和eval()方法是做什么的?
- 4. 如何使用Eigend求解Ax=b?有幾種方法?
- 5. 如何使用Eigen對矩陣做QR分解?Householder/Givens Rotation?
- 6. Eigen::Quaternion有哪幾種構造方法?其內部x,y,z,w的順序是怎么樣的?
- 7. 把矩陣、四元數或者包含矩陣、四元數的結構體放入STL容器需要注意什么?
Eigen有哪些需要注意的操作
1. Eigen有哪些行操作,列操作,塊操作,怎樣寫會更高效?
行操作:
matrix.row(n); matrix.topRows(n); matrix.bottomRows(n);列操作:
matrix.col(n); matrix.leftCols(n); matirx.rightCols(n);塊操作:
動態矩陣版本:
固定矩陣版本:
matrix.block<m,n>(i,j); // 大小為(m,n),起始于(i,j) matrix.topLeftCorner<m,n>(); matrix.bottomLeftCorner<m,n>(); matrix.topRightCorner<m,n>(); matrix.bottomRightCorner<m.n>();Eigen官方文檔上給出兩個建議:
(1) 固定矩陣版本的block在運行時效率更高,但在編譯是消耗的時間會更多;
(2) 在寫代碼時要讓Eigen知道盡可能多的信息,例如,如果是取一行操作就使用.col()操作,而不要使用.block()操作
2. ColMajor和RowMajor是什么?Eigen默認的是哪種?
ColMajor指按行優先存儲,RowMaor指按列有限存儲,默認是列有限
補充:
(1) 如果要和其他庫合作開發,為了轉化方便,可以選擇同樣的存儲方式;
(2) 應用中設計大量行遍歷操作,應該有限選擇行有限,尋址更快;
(3) 默認是列有限,而且大多庫是按照這個順序的;
3. noalias()和eval()方法是做什么的?
當相同的Matirx或者Array同時為等式的左值和右值時,容易出現混淆:
(1) 組件級別的操作不會出現混淆,例如matrix加法、scalar乘法、array乘法等,但是matrix乘法會出現混淆,而Eigen會默認解決混淆問題,如果你認為不會出現混淆,那么可以使用noalias()提高效率:
matB.noalias() = matA * matA;
(2) 如果混淆出現時,可以使用eval()函數解決,該函數會引入臨時變量以避免混淆:
matA = (matA*matB).eval();
4. 如何使用Eigend求解Ax=b?有幾種方法?
一共有五種方法:
(1) 直接求逆:
(2) 采用QR分解求求解:
x = A1.colPivHouseholderQr().solve(b1); // 速度:+ 精度:++ x = A1.fullPivHouseholderQr().solve(b1); // 速度:- 精度:+++(3)采用LU分解求解:
x = A1.partialPivLu().solve(b1); // 速度:++ 精度:+ x = A1.fullPivLu().solve(b1); // 速度:- 精度:+++(4)采用LLT分解求解:
x = A1.llt().solve(b1); // 速度:+++ 精度:+(5)采用LDLT分解求解:
x = A1.ldlt().solve(b1); // 速度:+++ 精度:++5. 如何使用Eigen對矩陣做QR分解?Householder/Givens Rotation?
(1)Householder進行QR分解:
HouseholderQR qr;
qr.compute(A);
MatrixXd R = qr.matrixQR().triangularViewEigen::Upper();
MatrixXd Q = qr.householderQ();
(2)Givens Rotation進行QR分解:
使用Givens Rotation進行QR分解的過程是通過Givens矩陣將待分解的矩陣從左下角開始逐漸消零為0的過程,在Eigen中沒有找到直接的實現,可能是要手擼這個過程,可以參考https://zhuanlan.zhihu.com/p/136551885
6. Eigen::Quaternion有哪幾種構造方法?其內部x,y,z,w的順序是怎么樣的?
Eigen::Quaternion內部的順序為w,x,y,z
從官網上看構造有如下幾種方式:
(0) 默認構造
(1) 直接賦值
Quaternion (const Scalar &w, const Scalar &x, const Scalar &y, const Scalar &z)(2) 從旋轉矩陣構造
Quaternion (const MatrixBase< Derived > &other)(3) 從軸角構造
Quaternion (const AngleAxisType &aa)(4) 從數組構造
Quaternion (const Scalar *data)(5) 從其他旋轉向量構造
Quaternion (const Quaternion< OtherScalar, OtherOptions > &other) Quaternion (const QuaternionBase< Derived > &other)7. 把矩陣、四元數或者包含矩陣、四元數的結構體放入STL容器需要注意什么?
對Eigen中的固定大小的類使用STL容器的時候,如果直接使用就會出錯,例如
std::map<int, Eigen::Vector4f> std::vector<Eigen::Vector2d>原因是固定大小的類是指在編譯過程中就已經分配好內存空間的類,為了提高運算速度,對于SSE或者AltiVec指令集,向量化必須要求向量是以16字節對齊的方式分配內存空間,所以針對這個問題,容器需要使用Eigen自己定義的內存分配器,即aligned_allocator。因此正確的寫法是:
std::map<int, Eigen::Vector4f, Eigen::aligned_allocator<std::pair<const int, Eigen::Vector4f>> std::vector<Eigen::Vector2d,Eigen::aligned_allocator<Eigen::Vector2d>>此外,對其他SLAM算法感興趣的同學可以看考我的博客SLAM算法總結——經典SLAM算法框架總結
總結
以上是生活随笔為你收集整理的Eigen有哪些需要注意的操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pytorch Document学习笔记
- 下一篇: 图像降噪算法——Variance Sta