在Eigen中,所有的矩陣Matrix和向量Vector都是由Matrix類構造的。向量只不過是矩陣的特殊形式,只有一列(列向量)或者一行。
Matrix模板類有6個參數,其中前三個參數是必須的。前三個參數如下:
Matrix<typename Scalar,int RowsAtCompileTime,int ColsAtCompileTime >
Scalar 是 標量類型,取值可以是 float ,int double 等。
RowsAtCompileTime 和 ColsAtCompileTime 是在程序編譯時就已經知道的矩陣的行數和列數。
Eigen 提供了一些常用的 定義好的類型。比如:
typedef Matrix<float,4,4> Matrix4f .
在Eigen中,列向量是默認向量,在不特別說明的情況下,向量Vector就是指的列向量。在Eigen中定義了列向量:
typedef Matrix<float,3,1> Vector3f ;
Eigen也定義了行向量:
typedef Matrix<int ,1,2 > RowVector2i ;
如果矩陣的尺寸在編譯的時候是不確定的,而在運行的時候才能確定,Eigen提供了定義動態大小的方法。比如非常好用的:
typedef Matrix<double ,Dynamic,Dynamic > MatrixXd;
MatrixXd定義了任意行數和列數的矩陣,可以在運行時確定。
類似地,對於向量有:
typedef Matrix<int ,Dynamic ,1> VectorXi ;
也可以對於一個維度確定,而指定另外一個維度是動態大小的。
Matrix<float,3,Dynamic> 矩陣的行數是 3,列數不確定。
矩陣的構造,Eigen提供了默認構造函數。
Matrix3f a;
MatirxXf b;
a 是一個3 x 3的矩陣,每個元素都是未初始化的float。
b 目前是一個 0 x 0 的矩陣。
帶參數的構造函數,對於矩陣,行數在列數前面,對於向量,只有向量的大小。
MatrixXf a(10,15);
VectorXf b(30);
a 是一個 10 x 15的動態大小的矩陣,分配了內存但是沒有初始化。
b 是一個動態大小的向量,大小是30,分配了內存但是沒有初始化。
對於維度在 4 以下的矩陣和向量,都定義了固定大小的類型。
例如可以使用,
Vector2d ; Vector3d ; Vector4d; 等來定義向量。
Matrix2f ;Matrix3f ; Matrix4f ; 等定義矩陣。
可以使用逗號初始化方式給矩陣和向量賦值。例如:
Matrix3f m;
m << 1,2,3,
4,5,6,
7,8,9;
這樣就將上述值賦給了矩陣,在Eigen中矩陣默認的存儲方式是行優先,就是先存儲行。
Eigen支持對動態大小的矩陣和向量重新指定大小。
rows() , cols() , size() 分別返回行數,列數和 元素的個數。
resize() 則可以重新指定矩陣大小。
實例如下;
1 #include <iostream> 2 #include <eigen3/Eigen/Dense> 3 4 using namespace Eigen; 5 6 7 int main(int argc ,char** argv) 8 { 9 MatrixXd m(2,5); 10 m.resize(3,4); 11 std::cout<<"The matrix m is of size " 12 <<m.rows()<<" x "<<m.cols()<<std::endl; 13 std::cout<<"It has"<<m.size()<<" coefficients"<<std::endl; 14 15 VectorXd v(2; 16 v.resize(5; 17 std::cout<<"The vector v is of size "<<v.size()<<std::endl; 18 std::cout<<"As a matrix, v is of size " 19 <<v.rows()<<" x "<<v.cols()<<std::endl; 20 21 return 0; 22 }
運行結果:
賦值和resize
對於動態大小的矩陣,使用操作符 = 的時候,左邊的矩陣大小會根據右邊的矩陣大小改變。
例如:
1 #include <iostream> 2 #include <eigen3/Eigen/Dense> 3 4 using namespace Eigen; 5 6 7 int main(int argc ,char** argv) 8 { 9 Matrix2f a(2,2); 10 std::cout<<"a is of size "<<a.rows()<<"x"<<a.cols()<<std::endl; 11 MatrixXf b(4,4); 12 a = b; 13 std::cout<<"a is now of size "<<a.rows()<<"x"<<a.cols()<<std::endl; 14 15 return 0; 16 }
運行結果如下:
固定大小和動態大小
對於小尺寸的矩陣,使用固定大小的方式,時間開銷要小的多。
Eigen 定義了相當多的方便使用的類型,其中還包括復數類型。
MatrixNt ,VectorNt ,RowVectorNt 。
N : 2,3,4,X ;
t : i ,f d ,cf cd.