Eigen库的使用小结

麹义
• 阅读 14040

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库的使用小结

流方式赋值

    //先创建对象,再用流操作方法赋值
    Eigen::Array<int, 3, 3> arr_2;
    arr_2 <<
        1, 2, 3,
        4, 5, 6,
        7, 8, 9;
    std::cout << arr_2 << std::endl;

输出为:

Eigen库的使用小结

指针方式赋值

    //用指针方法初始化
    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;

输出结果:

Eigen库的使用小结

这里需要特别注意,二维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
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
java反射Array的使用
1.什么是ArrayArray是一个类的简写,全限定类名是java.lang.reflect.Array.2.Array有什么用Array可以代表所有的数组,可以通过Array动态创建与修改里面的元素.3.Array使用示例(1)创建使用静态方法newI
Stella981 Stella981
3年前
C++ Eigen3实现Hatree
结合之前Matlab设计出来的向量化算法,实现了HatreeFork算法HatreeFork计算过程voidHatree_Fork(std::vector<double&ks,Eigen::MatrixXdN_up_avg,Eigen::MatrixXdN_down_avg,intncc){autoI
Stella981 Stella981
3年前
Eigen库
MatrixXd表示任意size的矩阵,元素类型为double;VectorXd表示任意size的向量,元素类型为double.//创建31的向量v,并赋值为1,2,3VectorXdv(3);v<<1,2,3;使用固定尺寸的Matrix,Vector相比于可变尺寸的Matrix,Vector,例如Matri
Wesley13 Wesley13
3年前
PHP算法:冒泡排序与快速排序
写一个排序算法,可以是冒泡排序或者快速排序,假设待排序对象是一个二维数组。(提示:不能使用系统已有函数,另外请仔细回忆以前学习过的基础知识)//冒泡排序<brfunctionbubble_sort($array)
{
&nbsp;&nbsp;<br$countcount($array);
&nbsp;&nb
Wesley13 Wesley13
3年前
PHP二维数组按某个键值排序
二维数组:$arrarray('name''小坏龙','age'28),array('name''小坏龙2','age'14),arr
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
C++矩阵处理库
项目要进行比较多的矩阵操作,特别是二维矩阵。刚开始做实验时,使用了动态二维数组,于是写了一堆Matrix函数,作矩阵的乘除加减求逆求行列式。实验做完了,开始做代码优化,发现Matrix.h文件里适用性太低,而且动态二维数组的空间分配与释放也影响效率,于是寻找其他解决方案。首先考虑的是与Matlab混合编程,折腾了半天把Matlab环境与VS2010环境之
Stella981 Stella981
3年前
Python数据分析
1.numpy\支持多维数组与矩阵的科学计算器包功能:常用功能16条a.ndarrayn维数组/矢量的操作。b. 支持高级大量的n维数组与矩阵的运算。c.针对数组运算提供大量的数学函数库。2.scipy\配合numpy完成对矩阵的计算,因此依赖于numpy,且含多个子模块功能:常用15个函数a. 标准导
Stella981 Stella981
3年前
Leetcode 363.矩形区域不超过k的最大数值和
矩形区域不超过k的最大数值和给定一个非空二维矩阵 _matrix_和一个整数_k_,找到这个矩阵内部不大于_k_的最大矩形和。示例:输入:matrix\\1,0,1\,\0,2,3\\,k2输出:2解释: 矩形区域 \\0,1\,