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