【高效能】Eigen矩陣庫使用事項
1、Eigen庫只有矩陣運算功能。Eigen相對專一,面對四元數、統計、微積分等高階運算功能,我建議還是使用專業的科學運算庫。
2、四階或以下的矩陣,尤其是固定大小的矩陣如Eigen::Matrix2i,通常進行了計算優化。
3、注意一下自身和非自身的變化:
說明 |
自身 |
非自身 |
轉置 |
transposeInPlace |
transpose |
歸一化 |
normalize |
normalized |
adjoint |
adjoinInPlace |
adjoint |
4、普通矩陣運算,不包含Svd等,只需要包含:
#include <Eigen/Core>
如果進行SVD,則加上
#include <Eigen/SVD>
如果不能進行求絕對值、逆矩陣運算,加上
#include <Eigen/LU>
如果不嫌棄編譯速度慢,就全加上
#include <Eigen/Dense>
還需要稀疏矩陣的話,使用
#include <Eigen/Eigen>
這樣,全部庫都加進去了
5、Eigen使用了緩式評估(lazy evaluation)策略,其中的運算子過載,並不返回矩陣值,而是返回一個計算表示類。最終的運算是在賦值等號operator =中進行的,這裡的過載符號解釋了計算表示類,然後進行矩陣運算。緩式評估的優點是計算速度快,避免多次的臨時變數的建立與析構。
6、多用typedef。一個典型的3階矩陣的表示式為:Eigen::Matrix3d。我們最好這樣:
typedef Eigen::Matrix3d mat3d
以後就用mat3d表示3階double型矩陣了。
7、如何使用SVD。一般SVD用在PCA演算法中,物件一般為等階矩陣,因此用FULL屬性。
假設Matlab的程式碼如下:
[s,v,d] = svd(mySvd);
則相應C++程式碼為:
Eigen::JacobiSVD<mat3d> mySvd(ss, Eigen::ComputeFullU |Eigen::ComputeFullV);
mat3d s = mySvd.matrixU();
vec3d v = mySvd.singularValues();
mat3d d = mySvd.matrixV();
8、常用矩陣
單位矩陣:Matrix3d::Identity();
全1矩陣:Matrix3d::Ones();
零矩陣:Matrix3d::Zero();
隨機矩陣:Matrix3d::Random();
三維向量:Eigen::Vector3d,本質是Matrix<double, 3,1>