Eigen庫的使用筆記
Matrix 與Array之間的差別與運算
Eigen里面主要有兩種數據結構,分別為Matrix與Array,其中Matrix即為數學意義上的矩陣,可以非常方便地進行線性代數相關的運算,而Array即為通常意義上的數組,可以是一維,也可以是二維。
Eigen的初始化
Eigen中的Matrix與Array的初始化方式十分相似,同時它們的初始化方法也很多,這里僅用Array作例子。
直接賦值
//直接賦值並初始化
Eigen::Array<int, 3, 1> arr_1(1, 2, 3);
std::cout << arr_1 << std::endl;
輸出為:

流方式賦值
//先創建對象,再用流操作方法賦值
Eigen::Array<int, 3, 3> arr_2;
arr_2 <<
1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << arr_2 << std::endl;
輸出為:

指針方式賦值
//用指針方法初始化
std::vector<int> vec_int{ 1,2,3,4,5,6,7,8,9 };
Eigen::Array<int, 3, 3> arr_3(vec_int.data());
std::cout << arr_3 << std::endl;
輸出結果:

這里需要特別注意,二維Array的元素的填充順序是按列來填充的,即數據的填充方式是先填充完第一列,再去填充第二列,最后得到填充完所有元素。
不定尺寸的Matrix與Array的操作
有時在創建Eigen中的Matrix或者Array的數據結構時,可能會暫時未知其尺寸大小,即行與列的數目待定,此時就需要按如下方式來進行創建Matrix或Array對象。
//創建不定大小的Array
Eigen::Array<float, Eigen::Dynamic, Eigen::Dynamic> arr_dynamic;
//創建大小不定的Matrix
Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> mat_dynamic;
創建Array時,哪一維的大小未知,就將那維設置為Eigen::Dynamic,哪一維的大小已知,就將該維的大小設為該值,Matrix在這方面也與Array同理。
在確切知道Array的大小並將要使用它時,需要先對Array進行resize操作,再使用Array(如賦值等等),即:
//對arr_dynamic進行resize操作,重新規定其尺寸大小
int row_cnt = 10, col_cnt = 100;
arr_dynamic.resize(row_cnt, col_cnt);
//對第(0,0)個元素進行賦值
arr_dynamic(0, 0) = 20;
多維數組的操作
Eigen中Array是一個模板類,它最多可以是二維,其模板為:
Array<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
其中Scalar為Array中的元素的數據類型,RowsAtCompileTime、ColsAtCompileTime分別為Array行與列的大小。
其中Scalar可以是int,double等常見的數據類型,也可以是Eigen::Array或者是Eigen::Matrix等類型,如果是使用Eigen::Array,則可以構造一個多維數組。示例如下:
//創建一個3x3x2的Array
Eigen::Array<Eigen::Array2d, 3, 3> arr_arr;
//為arr_arr中的第(0,0)個元素賦值
arr_arr(0, 0) = Eigen::Array2d::Ones();
//為arr_arr中的第(0,1)個元素賦值
arr_arr(0, 1) = Eigen::Array2d::Ones() * 2;
//輸出結果
std::cout << "arr_arr(0,0) = " << std::endl <<
arr_arr(0, 0) << std::endl;
std::cout << "arr_arr(0,1) = " << std::endl <<
arr_arr(0, 1) << std::endl;
輸出結果如下:
arr_arr(0,0) =
1
1
arr_arr(0,1) =
2
2