Eigen Matrix 详解

在Eigen中,所有的matrices 和vectors 都是模板类Matrix 的对象,Vectors 只是一种特殊的矩阵,行或者列为1.

Matrix的前三个模板参数

Matrix 类有6个模板参数,现在我们了解前三个足够。剩下的三个参数都有默认值,后面会探讨,现在不管他。

Matrix 的三个强制的模板参数:

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

Scalar 就是矩阵元素标量类型。

RowsAtCompileTime 和ColsAtCompileTime 分别指代编译时候的行和列值。

Eigen中提供了许多typedefs ,例如Matrix4f 是4*4的float型矩阵:

typedef Matrix<float, 4, 4> Matrix4f;

正如前面提到的那样,在Eigen中,vectors 只是一种特殊形式的矩阵,有一行或者一列。在大多数情况下一列比较多,这样的向量也叫做列向量,也简称向量。其他情况叫做行向量。

例如typedef Vector3f 是一个(列)向量,它的定义如下

typedef Matrix<float, 3, 1> Vector3f;

同样我们也提供了行向量的定义:

typedef Matrix<int, 1, 2> RowVector2i;

特殊值Dynamic

当然,Eigen 不局限于在编译时候确定大小的矩阵。模板参数RowsAtCompileTime 和ColsAtCompileTime 可以传入特殊的值Dynamic ,来标志在编译时大小无法确定,需要当做运行时变量来处理。在中的术语叫做动态大小,与之相应的在编译时确定大小的叫做固定大小。

例如typedef MatrixXd,指的是元素为double,大小为动态的:

typedef Matrix<double, Dynamic, Dynamic> MatrixXd;1

类似 typedef VectorXi如下:

typedef Matrix<int, Dynamic, 1> VectorXi;1

当然你可以定义一个固定行的,列是动态的float矩阵如下:

Matrix<float, 3, Dynamic>1

构造器

总是会有默认的构造器,不会进行动态内存分配,也不会初始化矩阵元素。

Matrix3f a;
MatrixXf b;12

这里,a是一个33的元素,其中还有一个float[9]数组,其中的元素没有初始化;b是一个动态大小的矩阵,目前的大小是00,它的元素数组完全没有分配。

构造器中全入大小的构造器也是有的,行是先传入的。对于向量,直接传入向量大小。他们会分配元素数组,但是不会初始化元素。

MatrixXf a(10,15);
VectorXf b(30);12

这里,a是10x15动态矩阵,数组内存已经分配,但是没有初始化;b是一个大小为30的向量,数组内存已经分配,但是元素没有初始化。

为了提供统一的API ,在固定类型的矩阵上指定大小也是合法的,例如:

Matrix3f a(3,3);1

最后,我们提供了一些便捷方式为小的大小的向量元素提供初始化方法:

Vector2d a(5.0, 6.0);
Vector3d b(5.0, 6.0, 7.0);
Vector4d c(5.0, 6.0, 7.0, 8.0);123

逗号初始化


void fun3()
{
Eigen::Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
std::cout << m;
}12345678

Matrix 和 vector元素可以通过逗号分隔初始化方法初始化

Resizing

rows(), cols() 和 size(). 分别返回矩阵的行数、列数和元素的个数.动态矩阵大小可以通过 resize()改变大小

void fun4()
{
Eigen::MatrixXd m(2,5);
cout<<"m "<<"rows="<<m.rows()<<"cols="<<m.cols()<<"coefficeints="<<m.size()<<endl;
m.resize(4,5);
cout<<"m "<<"rows="<<m.rows()<<"cols="<<m.cols()<<"coefficeints="<<m.size()<<endl;
Eigen::VectorXd v(2);
v.resize(5);
cout<<"v "<<"rows="<<v.rows()<<"cols="<<v.cols()<<"coefficeints="<<v.size()<<endl;
}12345678910

resize() 如果大小没有变化将不会进行任何操作,否则则是破坏性的。如果你想使用resize() 同时不想改变元素的值,请使用conservativeResize()。

为了达到API 的一致性,所有固定大小的矩阵都有上面的方法,试着改变固定大小的矩阵会触发断言错误。以下代码是合法的:

 Matrix4d m;
m.resize(4,4); // no operation
std::cout << "The matrix m is of size "
<< m.rows() << "x" << m.cols() << std::endl;1234

Assignment 和resizing

赋值是将一个矩阵拷贝进另外一个矩阵,使用操作符=。Eigen 会自动跳转左面元素的大小,从而使得它和右侧元素匹配。例如:

MatrixXf a(2,2);
std::cout << "a is of size " << a.rows() << "x" << a.cols() << std::endl;
MatrixXf b(3,3);
a = b;
std::cout << "a is now of size " << a.rows() << "x" << a.cols() << std::endl;12345

a原先大小 2x2

a现在大小 3x3

当然,如果左侧是固定大小的矩阵,那么改变大小是不允许的。

如果你不需要这种自动调整大小,你可以将他关闭。

可选模板参数

我下面看看剩下的三个可选参数:

Matrix<typename Scalar,
int RowsAtCompileTime,
int ColsAtCompileTime,
int Options = 0,
int MaxRowsAtCompileTime = RowsAtCompileTime,
int MaxColsAtCompileTime = ColsAtCompileTime>123456

Options 是一个位字段。我们只讨论一个RowMajor,是按行存储,默认是按列存储的。Matrix

引自:https://blog.csdn.net/sn_gis/article/details/79015488

eigen Matrix详解的更多相关文章

  1. CSS 2D转换 matrix() 详解

    2D转换 IE10.Firefox.Opera 支持 transform 属性 Chrome.Safari 需要前缀 -webkit- . IE9 需要前缀 -ms- . translate():接收 ...

  2. Android Matrix详解

    Matrix的数学原理 平移变换 旋转变换 缩放变换 错切变换 对称变换 代码验证 Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.An ...

  3. Code force-CodeCraft-20 (Div. 2) D. Nash Matrix 详解(DFS构造)

    D. Nash Matrix time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...

  4. Android图片缓存之Bitmap详解

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...

  5. Android开发重点难点1:RelativeLayout(相对布局)详解

    前言 啦啦啦~博主又推出了一个新的系列啦~ 之前的Android开发系列主要以完成实验的过程为主,经常会综合许多知识来写,所以难免会有知识点的交杂,给人一种混乱的感觉. 所以博主推出“重点难点”系列, ...

  6. Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

    一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含多个Action(动作. ...

  7. 转载爱哥自定义View系列--Paint详解

    上图是paint中的各种set方法 这些属性大多我们都可以见名知意,很好理解,即便如此,哥还是带大家过一遍逐个剖析其用法,其中会不定穿插各种绘图类比如Canvas.Xfermode.ColorFilt ...

  8. [转] KMP算法详解

    转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的K ...

  9. 详解android:scaleType属性

    详解android:scaleType属性 转自:http://blog.csdn.net/encienqi/article/details/7913262    http://juliaailse. ...

随机推荐

  1. 慕容小匹夫 Unity3D移动平台动态读取外部文件全解析

    Unity3D移动平台动态读取外部文件全解析   c#语言规范 阅读目录 前言: 假如我想在editor里动态读取文件 移动平台的资源路径问题 移动平台读取外部文件的方法 补充: 回到目录 前言: 一 ...

  2. .gitignore设置

    git提交的时候一直提示 e/.idea/workspace.xml文件冲突, 这个文件是IDE编辑的时候自动带的文件,这个文件在提交的时候是不需要上传到git中的 这个时候我们需要这种.gitign ...

  3. SQL数据库优化

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. CentsOS6 Tomcat7 报javax.management.InstanceNotFoundException 解决办法

    警告: Failed to unregister MBean with name [Catalina:j2eeType=Servlet,name=UploadServlet,WebModule=//l ...

  5. yii2-ueditor

    扩展下载(yii2.0-ueditor) 框架下载(Yii 2.0.6 高级版) 描述: 最佳适用于yii2.0 高级版(advanced)应用框架,对于基础板(basic)及其他框架要修改对应的命名 ...

  6. devmapper: Thin Pool has 162394 free data blocks which is less than minimum required 163840 free data blocks. Create more free space in thin pool or use dm.min_free_space option to change behavior

    问题: 制作镜像的时候报错 devmapper: Thin Pool has 162394 free data blocks which is less than minimum required 1 ...

  7. 1.3、CDH 搭建Hadoop在安装之前(端口)

    端口 Cloudera Manager,CDH组件,托管服务和第三方组件使用下表中列出的端口.在部署Cloudera Manager,CDH和托管服务以及第三方组件之前,请确保在每个系统上打开这些端口 ...

  8. c3p0的几种使用方式(原文地址: https://my.oschina.net/liangtee/blog/101047)

    package com.c3p0.test; import java.sql.Connection; import java.sql.SQLException; import java.beans.P ...

  9. macOS 为 Markdown 文件开启全文检索方法

    曾经的我一向使用 Evernote + 马克飞象来记载笔记和文档.不过感觉这两个东西越来越不思进取,几年都没什么变化.所以,一年多曾经,我就把一切笔记迁移成本地 Markdown 文件,合作 Drop ...

  10. sqoop2 缺少 jackson-core-asl-1.8.8.jar 和 jackson-mapper-asl-1.8.8.jar 这两个jar包

    [root@spark2 client]# cat /var/log/sqoop2/localhost.2017-12-22.log 十二月 22, 2017 10:29:17 上午 org.apac ...