1.5 高级初始化

这一节讨论一些初始化矩阵的高级方法。

1.The comma initializer

eigen提供一个简单设定所有矩阵系数、向量、数组系数的初始化语法,从左上角开始到右下角结束。

Matrix3f m;
m << , , ,
, , ,
, , ;
std::cout << m;
//output

另外,这个初始化也可以将多个向量或者矩阵结合起来,但是必须记住你在使用初始化器之前需要设置大小:

RowVectorXd vec1();
vec1 << , , ;
std::cout << "vec1 = " << vec1 << std::endl;
RowVectorXd vec2();
vec2 << , , , ;
std::cout << "vec2 = " << vec2 << std::endl;
RowVectorXd joined();
joined << vec1, vec2;//vec1后接vec2
std::cout << "joined = " << joined << std::endl;
//output
vec1 =
vec2 =
joined =

我们也可以使用块来初始化矩阵:

MatrixXf matA(, );
matA << , , , ;
MatrixXf matB(, );
matB << matA, matA/, matA/, matA;
std::cout << matB << std::endl;
//output
0.1 0.2
0.3 0.4
0.1 0.2
0.3 0.4

这样的初始化形式也能初始化矩阵的块,比如:

Matrix3f m;
m.row() << , , ;
m.block(,,,) << , , , ;
m.col().tail() << , ;
std::cout << m;
//output

2.特殊的矩阵和数组

矩阵和数组类同样也有静态成员(访问得用作用域访问符)的方法比如Zero(),初始化所有系数为0。有三种用法:第一种是空括号,使用与固定大小的对象;第二种是带一个参数的括号,适用于一维的动态大小对象;第三种是带有两个参数的括号,适用于二维的动态大小的对象。如下:

std::cout << "A fixed-size array:\n";
Array33f a1 = Array33f::Zero();
std::cout << a1 << "\n\n";
std::cout << "A one-dimensional dynamic-size array:\n";
ArrayXf a2 = ArrayXf::Zero();
std::cout << a2 << "\n\n";
std::cout << "A two-dimensional dynamic-size array:\n";
ArrayXXf a3 = ArrayXXf::Zero(, );
std::cout << a3 << "\n";
//output
A fixed-size array: A one-dimensional dynamic-size array: A two-dimensional dynamic-size array:

类似地,静态成员Constan(value)设置所有系数为某个常数。如果对象的大小需要确定,则在数值参数之前需要额外的两个参数,例如MatrixXd::Constant(rows,
cols,
value)。Random()的静态成员是给矩阵或数组设置任一的值。单位矩阵是用Identity()函数,这个函数只适用与矩阵,而不适用与数组,因为单位矩阵是线性代数的概念。函数LinSpaced(size,low,high)只适用与向量和一维数组,它让某一大小的向量或数组的系数均匀地从低到高的填满,如下所示:

ArrayXXf table(, );
table.col() = ArrayXf::LinSpaced(, , );
table.col() = M_PI / * table.col();
table.col() = table.col().sin();
table.col() = table.col().cos();
std::cout << " Degrees Radians Sine Cosine\n";
std::cout << table << std::endl;
//output
Degrees Radians Sine Cosine 0.175 0.174 0.985
0.349 0.342 0.94
0.524 0.5 0.866
0.698 0.643 0.766
0.873 0.766 0.643
1.05 0.866 0.5
1.22 0.94 0.342
1.4 0.985 0.174
1.57 -4.37e-08

以上的函数都是将函数返回值赋值给需要的矩阵而不是直接在需要改变的矩阵上使用,如果想直接在现有矩阵上改变,可以使用setZero(),setIdentity(),setLinSpaced()函数:

const int size = ;

MatrixXd mat1(size, size);

mat1.topLeftCorner(size/, size/) = MatrixXd::Zero(size/, size/);

mat1.topRightCorner(size/, size/) = MatrixXd::Identity(size/, size/);

mat1.bottomLeftCorner(size/, size/) = MatrixXd::Identity(size/, size/);

mat1.bottomRightCorner(size/, size/) = MatrixXd::Zero(size/, size/);

std::cout << mat1 << std::endl << std::endl;

MatrixXd mat2(size, size);

mat2.topLeftCorner(size/, size/).setZero();

mat2.topRightCorner(size/, size/).setIdentity();

mat2.bottomLeftCorner(size/, size/).setIdentity();

mat2.bottomRightCorner(size/, size/).setZero();
std::cout << mat2 << std::endl << std::endl;
MatrixXd mat3(size, size);
mat3 << MatrixXd::Zero(size/, size/), MatrixXd::Identity(size/, size/),
MatrixXd::Identity(size/, size/), MatrixXd::Zero(size/, size/);
std::cout << mat3 << std::endl;
//output

1.5eigen中高级初始化的更多相关文章

  1. 给iOS中高级求职者的一份面试题解答

    前段时间更新了一篇 给iOS中高级面试官的一份招聘要求 收到很多小伙伴的点赞与关注.可能有很多小伙伴已经带着我在那篇文章给大家提供的一些面试技巧 & 其中的面试题 已经开始招聘或者应聘了!这里 ...

  2. 中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(上)

    前言 当下,正面临着近几年来的最严重的互联网寒冬,听得最多的一句话便是:相见于江湖~.缩减HC.裁员不绝于耳,大家都是人心惶惶,年前如此,年后想必肯定又是一场更为惨烈的江湖厮杀.但博主始终相信,寒冬之 ...

  3. Java初始化过程

    这篇文章主要讲解Java在创建对象的时候,初始化的顺序.主要从以下几个例子中讲解: 继承关系中初始化顺序 初始化块与构造器的顺序 已经加载过的类的初始化顺序 加载父类,会不会加载子类 创建子类对象会不 ...

  4. nginx源码分析之模块初始化

    在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要 ...

  5. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  6. Java类变量和成员变量初始化过程

    一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...

  7. Git学习笔记一:新建本地仓库及初始化

    1.百度搜索Git下载安装,直接按默认选项安装即可. 例如:Git-2.7.2-32-bit_setup.1457942412.exe 2.配置Git信息,建立版本仓库 (Alt+PrintScerr ...

  8. Spring MVC初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

  9. SpringMVC初始化参数绑定--日期格式

    一.初始化参数绑定[一种日期格式] 配置步骤: ①:在applicationcontext.xml中只需要配置一个包扫描器即可 <!-- 包扫描器 --> <context:comp ...

随机推荐

  1. 队列&广搜

    搜索里有深搜,又有广搜,而广搜的基础就是队列. 队列是一种特殊的线性表,只能在一段插入,另一端输出.输出的那一端叫做队头,输入的那一端叫队尾.是一种先进先出(FIFO)的数据结构. 正经的队列: 头文 ...

  2. 读书笔记——《redis入门指南(第2版)》第三章 入门

    3 .redis的5种数据类型及相应命令 redis不区分命令大小写. string 512m 一个散列类型键可包含至多232-1个字段 一个列表类型键最多能容纳232-1个元素 一个集合类型键最多能 ...

  3. Using a ScrollView - RN4

    使用滚动条. 1. import import {ScrollView} from "react-native"; 2. Using <ScrollView> ... ...

  4. 多线程之sleep和wait的区别

    它们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁. 还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用inter ...

  5. java中Class.getMethod方法

    Method Class.getMethod(String name, Class<?>... parameterTypes)的作用是获得对象所声明的公开方法 该方法的第一个参数name是 ...

  6. poi横纵导出

    dao <select id="selectTargetModel" resultMap="targetMap"> select si.SHOP_N ...

  7. 尚硅谷springboot学习29-docker常用命令和操作

    前提是要安装docker,有关docker的安装请参考相关资料,下面来看一下常用的操作命令 1).镜像操作 操作 命令 说明 检索 docker search 关键字 eg:docker search ...

  8. python-imaging-tk : Depends: python-imaging (= 1.1.7-4ubuntu0.12.04.3) but 3.1.2-0ubuntu1.1 is to be installed E: Unable to corre

    最近,将电脑主机升级到ubuntu16.04,但是需要用到 python-imaging-tk,先是报错: import PIL.ImageTk as ImageTkImportError: No m ...

  9. 大端&小端问题

  10. UVA10600 次小生成树

    题目链接:https://vjudge.net/problem/UVA-10600 题意:叫我们求出最小生成树的边权之和 和次小生成树的边权之和. 思路:我们可以先求出最小生成树,这个不难,如果要求次 ...