Eigen學習筆記2-Matrix類


  在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.

 

  

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM