1. 程式人生 > >【高效能】Eigen矩陣庫使用事項

【高效能】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>