Eigen教程(6)之高级初始化方法
转载于: https://www.cnblogs.com/houkai/p/6351358.html
高级初始化方法
本篇介绍几种高级的矩阵初始化方法,重点介绍逗号初始化和特殊矩阵(单位阵、零阵)。
逗号初始化
Eigen提供了逗号操作符允许我们方便地为矩阵/向量/数组中的元素赋值。顺序是从左上到右下:自左到右,从上至下。对象的尺寸需要事先指定,初始化的参数也应该和要操作的元素数目一致。
Matrix3f m;
m << 1, 2, 3,4, 5, 6,7, 8, 9;
std::cout << m;
初始化列表不仅可以是数值也可以是vectors或matrix。
RowVectorXd vec1(3);
vec1 << 1, 2, 3;
std::cout << "vec1 = " << vec1 << std::endl;
RowVectorXd vec2(4);
vec2 << 1, 4, 9, 16;
std::cout << "vec2 = " << vec2 << std::endl;
RowVectorXd joined(7);
joined << vec1, vec2;
std::cout << "joined = " << joined << std::endl;
输出
vec1 = 1 2 3
vec2 = 1 4 9 16
joined = 1 2 3 1 4 9 16
也可以使用块结构。
MatrixXf matA(2, 2);
matA << 1, 2, 3, 4;
MatrixXf matB(4, 4);
matB << matA, matA/10, matA/10, matA;
std::cout << matB << std::endl;
输出
1 2 0.1 0.23 4 0.3 0.4
0.1 0.2 1 2
0.3 0.4 3 4
同时逗号初始化方式也可以用来为块表达式赋值。
Matrix3f m;
m.row(0) << 1, 2, 3;
m.block(1,0,2,2) << 4, 5, 7, 8;
m.col(2).tail(2) << 6, 9;
std::cout << m;1 2 3
4 5 6
7 8 9
特殊的矩阵和向量
零阵:类的静态成员函数Zero(),有三种定义形式。
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(3);
std::cout << a2 << "\n\n";
std::cout << "A two-dimensional dynamic-size array:\n";
ArrayXXf a3 = ArrayXXf::Zero(3, 4);
std::cout << a3 << "\n";
输出
A fixed-size array:
0 0 0
0 0 0
0 0 0A one-dimensional dynamic-size array:
0
0
0A two-dimensional dynamic-size array:
0 0 0 0
0 0 0 0
0 0 0 0
类似地,还有常量矩阵:Constant([rows],[cols],value),Random()随机矩阵。
单位阵Identity()方法只能使用与Matrix不使用Array,因为单位阵是个线性代数概念。
LinSpaced(size, low, high)可以从low到high等间距的size长度的序列,适用于vector和一维数组。
ArrayXXf table(10, 4);
table.col(0) = ArrayXf::LinSpaced(10, 0, 90);
table.col(1) = M_PI / 180 * table.col(0);
table.col(2) = table.col(1).sin();
table.col(3) = table.col(1).cos();
std::cout << " Degrees Radians Sine Cosine\n";
std::cout << table << std::endl;
输出
Degrees Radians Sine Cosine0 0 0 110 0.175 0.174 0.98520 0.349 0.342 0.9430 0.524 0.5 0.86640 0.698 0.643 0.76650 0.873 0.766 0.64360 1.05 0.866 0.570 1.22 0.94 0.34280 1.4 0.985 0.17490 1.57 1 -4.37e-08
功能函数
Eigen也提供可同样功能的函数:setZero(), MatrixBase::setIdentity()和 DenseBase::setLinSpaced()。
const int size = 6;
MatrixXd mat1(size, size);
mat1.topLeftCorner(size/2, size/2) = MatrixXd::Zero(size/2, size/2);
mat1.topRightCorner(size/2, size/2) = MatrixXd::Identity(size/2, size/2);
mat1.bottomLeftCorner(size/2, size/2) = MatrixXd::Identity(size/2, size/2);
mat1.bottomRightCorner(size/2, size/2) = MatrixXd::Zero(size/2, size/2);
std::cout << mat1 << std::endl << std::endl;
MatrixXd mat2(size, size);
mat2.topLeftCorner(size/2, size/2).setZero();
mat2.topRightCorner(size/2, size/2).setIdentity();
mat2.bottomLeftCorner(size/2, size/2).setIdentity();
mat2.bottomRightCorner(size/2, size/2).setZero();
std::cout << mat2 << std::endl << std::endl;
MatrixXd mat3(size, size);
mat3 << MatrixXd::Zero(size/2, size/2), MatrixXd::Identity(size/2, size/2),MatrixXd::Identity(size/2, size/2), MatrixXd::Zero(size/2, size/2);
std::cout << mat3 << std::endl;
输出均为
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
三种赋值(初始化)的方式逗号初始化、特殊阵的静态方法和功能函数setXxx()。
表达式变量
上面的静态方法如 Zero()、Constant()并不是直接返回一个矩阵或数组,实际上它们返回的是是‘expression object’,只是临时被使用/被用于优化。
m = (m + MatrixXd::Constant(3,3,1.2)) * 50;
MatrixXf::Constant(3,3,1.2)
构建的是一个3*3的矩阵表达式(临时变量)。
逗号初始化的方式也可以构建这种临时变量,这是为了获取真正的矩阵需要调用finished()函数:
MatrixXf mat = MatrixXf::Random(2, 3);
std::cout << mat << std::endl << std::endl;
mat = (MatrixXf(2,2) << 0, 1, 1, 0).finished() * mat;
std::cout << mat << std::endl;
输出
0.68 0.566 0.823
-0.211 0.597 -0.605-0.211 0.597 -0.6050.68 0.566 0.823
Eigen教程(6)之高级初始化方法相关推荐
- Eigen教程1 - 基础
Eigen教程1 - 基础 参考:https://blog.csdn.net/xuezhisdc/article/details/54619853 固定大小的矩阵和向量 /** 参考链接:http:/ ...
- Ubuntu 11.10 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答
学技术怎么能不会用服务器,阿里云服务器现8折优惠,还有更多优惠券限量发放 https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.ht ...
- (已更新)Ubuntu 14.04 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答
内容 文章标题 : (已更新)Ubuntu 14.04 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答 发表于 : 2008-08-03 0:57 [ ...
- Ubuntu 13.04 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答
[2013年4月28日更新] Ubuntu Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答. 本教程最早是一善鱼 YQ-YSY 于2008年编写并发布在Ubuntu ...
- k8s之Pod详解(五)【Kubernetes(K8S) 入门进阶实战完整教程,黑马程序员K8S全套教程(基础+高级)】
参考于Kubernetes(K8S) 入门进阶实战完整教程,黑马程序员K8S全套教程(基础+高级) Pod Pod的结构 每个Pod中都可以包含一个或者多个容器 这些容器可以分为两类: 用户自定义用的 ...
- 神经网络在Keras中不work!博士小哥证明何恺明的初始化方法堪比“CNN还魂丹”...
铜灵 发自 凹非寺 量子位 出品 | 公众号 QbitAI 南巴黎电信学院(Télécom SudParis)的在读博士生Nathan Hubens在训练CNN时遇到点难题. 使用在CIFAR10数据 ...
- 计算机二级教程书pdf MS,全国计算机等级考试二级教程MS Office高级应用教学大纲4.pdf...
<全国计算机等级考试二级教程 MS Office> 教学大纲 一.课程信息 课程名称:全国计算机等级考试二级教程 MS Office 高级应用 课程类别:素质选修课/专业基础课 课程性质: ...
- python是人都能学会_人人都能学会的python编程教程15:高级特性2
生成器 如果你想要一百万个数,而这些数里只有一百个数是你经常要用的,剩下的都几乎不怎么会用到,那么如果直接把这一百万个数全部放在list中是不明智的因为这会浪费较多存储空间,生成器就是为了解决这个问题 ...
- 吴恩达深度学习L2W1——神经网络权重初始化方法、正则化
文章目录 神经网络的初始化 初始化数据 模型搭建 简单函数 零初始化--initialize_parameters_zeros 随机初始化--initialize_parameters_random ...
最新文章
- 利用WindowsPhone7_SDK_Full.rar_for_xp,在xp下安装sdk,部署xap软件的教程
- 从零开始的C++网络编程
- 路由的Modem信号控制
- 落魄前端,整理给自己的前端知识体系复习大纲(下篇)
- Spring Boot 在Gradle构建中使用Log4j日志
- *1LL在c++中的意义
- SVN自动定时更新方法
- ubuntu下MySQL无法启动Couldn't find MySQL server (/usr/bin/mysqld_safe)”
- mysql 使用gzip 压缩 文件,本地对 gzip 压缩的文件解压缩
- 遥感原理与应用总结——第一章:遥感原理的基本概念
- 2021年全球与中国天然气和石油钻头行业市场规模及发展前景分析
- 编译ThingsBoard V3.3.2源码
- 多进程写同一个日志并发问题分析
- c语言延时时间计算器,RC延时电路延时时间计算
- Java 8 字符串和时间相互转换
- “请输入的月份“判断季节
- java ee 值范围_一篇文章带你读懂: Java EE
- Internet在中国
- 基于PaddlePaddle实现的EcapaTdnn声纹识别模型
- 企业管理的基本知识有哪些?如何梳理企业流程管理?
热门文章
- Android APK反编译详解 .
- xcode 4 制作静态库(转)
- CentOS 7.6安装ZABBIX 4.4.0 + TimescaleDB
- Zabbix触发器和监控项设置时间范围.
- Linux系统性能相关知识学习
- QT学习之解决QT中QIcon图标不显示的问题
- 断言(Assert)与异常(Exception)
- abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二)
- 用argparse解析布尔值
- 我可以在不提供FTP访问的情况下安装/更新WordPress插件吗?