---
# System prepended metadata

title: Eigen簡介及簡易教學

---

## Introduction to Eigen Library
Eigen 是一個高效能的 C++ 線性代數庫，專門用來處理矩陣運算和數學計算。它是 header-only（不需要額外編譯），只要把library加到專案裡面就可以直接使用。筆者會用到這個函式庫是因為要做機器人的逆向運動學計算等等。

我覺得最大的好處是他的語法和Matlab高度相似，index是用()來表示:laughing: 

## 矩陣及向量宣告
- 宣告一個已知大小的矩陣
```cpp
Matrix<double, 3, 3> A; // 引數可以決定(row, column)
```
- 矩陣賦值
有兩種方法，使用`<<`或是像matlab一樣直接用index取用。==需要注意的是matlab的index從1開始；但是Eigen沿用C語言模式從0開始。==
```cpp!
Matrix<double, 3, 3> A; // declaration matrix A
// two ways to assign value to matrix A
A << 1,2,3,
     4,5,6,
     7,8,9; // use << to assign value

A(0,0) = 1; // use index to access/assign value 
A(1,2) = 2;
```
如果要新增一個特殊的矩陣，像是單位矩陣、零矩陣或是元素全部都是1的矩陣，Eigen也有提供一些方便的函式
```cpp=
// Eigen                            // Matlab
MatrixXd::Identity(rows,cols)       // eye(rows,cols)
C.setIdentity(rows,cols)            // C = eye(rows,cols)
MatrixXd::Zero(rows,cols)           // zeros(rows,cols)
C.setZero(rows,cols)                // C = ones(rows,cols)
MatrixXd::Ones(rows,cols)           // ones(rows,cols)
C.setOnes(rows,cols)                // C = ones(rows,cols)
MatrixXd::Random(rows,cols)         // rand(rows,cols)*2-1
C.setRandom(rows,cols)              // C = rand(rows,cols)*2-1
VectorXd::LinSpaced(size,low,high)  // linspace(low,high,size)'
v.setLinSpaced(size,low,high)       // v = linspace(low,high,size)'
```
## 矩陣及向量運算
當然也有矩陣、向量乘法相關的運算。比較方便的地方是做乘法運算的時候可以直接使用+-/等運算子，這方面和matlab比較來很像，也很方便。
```cpp=
Vector3f x;
Vector3f y;
Matrix<double, 3, 3> M;

x.dot(y); // inner product
x.cross(y);
y = M*x;
```
最重要的是還有提供pseudo inverse，不用自己做svd分解幹嘛的
```cpp=
// jacobian is a matrix
jacobian.completeOrthogonalDecomposition().pseudoInverse();
```
## 其他性質
其他常用的則是獲取矩陣的長寬、或是向量的norm之類的。
```cpp=
Vector3f x;
Matrix<double, 3, 3> mat;
// vector related
x.norm();
x.squaredNorm();
x.size();
// matrix related
mat.rows();
mat.col();
```
## 參考資料
以上只是列出比較常用的操作，詳細教學可以見下面兩個網站
- [Eigen: Main page](https://eigen.tuxfamily.org/dox/)
- [C++矩陣庫Eigen快速入門](https://jasonblog.github.io/note/third-party/cju_zhen_ku_eigen_kuai_su_ru_men.html)

