转载于: 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)之高级初始化方法相关推荐

  1. Eigen教程1 - 基础

    Eigen教程1 - 基础 参考:https://blog.csdn.net/xuezhisdc/article/details/54619853 固定大小的矩阵和向量 /** 参考链接:http:/ ...

  2. Ubuntu 11.10 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答

    学技术怎么能不会用服务器,阿里云服务器现8折优惠,还有更多优惠券限量发放 https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.ht ...

  3. (已更新)Ubuntu 14.04 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答

      内容   文章标题 : (已更新)Ubuntu 14.04 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答 发表于 : 2008-08-03 0:57    [ ...

  4. Ubuntu 13.04 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答

    [2013年4月28日更新] Ubuntu Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答. 本教程最早是一善鱼 YQ-YSY 于2008年编写并发布在Ubuntu ...

  5. k8s之Pod详解(五)【Kubernetes(K8S) 入门进阶实战完整教程,黑马程序员K8S全套教程(基础+高级)】

    参考于Kubernetes(K8S) 入门进阶实战完整教程,黑马程序员K8S全套教程(基础+高级) Pod Pod的结构 每个Pod中都可以包含一个或者多个容器 这些容器可以分为两类: 用户自定义用的 ...

  6. 神经网络在Keras中不work!博士小哥证明何恺明的初始化方法堪比“CNN还魂丹”...

    铜灵 发自 凹非寺 量子位 出品 | 公众号 QbitAI 南巴黎电信学院(Télécom SudParis)的在读博士生Nathan Hubens在训练CNN时遇到点难题. 使用在CIFAR10数据 ...

  7. 计算机二级教程书pdf MS,全国计算机等级考试二级教程MS Office高级应用教学大纲4.pdf...

    <全国计算机等级考试二级教程 MS Office> 教学大纲 一.课程信息 课程名称:全国计算机等级考试二级教程 MS Office 高级应用 课程类别:素质选修课/专业基础课 课程性质: ...

  8. python是人都能学会_人人都能学会的python编程教程15:高级特性2

    生成器 如果你想要一百万个数,而这些数里只有一百个数是你经常要用的,剩下的都几乎不怎么会用到,那么如果直接把这一百万个数全部放在list中是不明智的因为这会浪费较多存储空间,生成器就是为了解决这个问题 ...

  9. 吴恩达深度学习L2W1——神经网络权重初始化方法、正则化

    文章目录 神经网络的初始化 初始化数据 模型搭建 简单函数 零初始化--initialize_parameters_zeros 随机初始化--initialize_parameters_random ...

最新文章

  1. 利用WindowsPhone7_SDK_Full.rar_for_xp,在xp下安装sdk,部署xap软件的教程
  2. 从零开始的C++网络编程
  3. 路由的Modem信号控制
  4. 落魄前端,整理给自己的前端知识体系复习大纲(下篇)
  5. Spring Boot 在Gradle构建中使用Log4j日志
  6. *1LL在c++中的意义
  7. SVN自动定时更新方法
  8. ubuntu下MySQL无法启动Couldn't find MySQL server (/usr/bin/mysqld_safe)”
  9. mysql 使用gzip 压缩 文件,本地对 gzip 压缩的文件解压缩
  10. 遥感原理与应用总结——第一章:遥感原理的基本概念
  11. 2021年全球与中国天然气和石油钻头行业市场规模及发展前景分析
  12. 编译ThingsBoard V3.3.2源码
  13. 多进程写同一个日志并发问题分析
  14. c语言延时时间计算器,RC延时电路延时时间计算
  15. Java 8 字符串和时间相互转换
  16. “请输入的月份“判断季节
  17. java ee 值范围_一篇文章带你读懂: Java EE
  18. Internet在中国
  19. 基于PaddlePaddle实现的EcapaTdnn声纹识别模型
  20. 企业管理的基本知识有哪些?如何梳理企业流程管理?

热门文章

  1. Android APK反编译详解 .
  2. xcode 4 制作静态库(转)
  3. CentOS 7.6安装ZABBIX 4.4.0 + TimescaleDB
  4. Zabbix触发器和监控项设置时间范围.
  5. Linux系统性能相关知识学习
  6. QT学习之解决QT中QIcon图标不显示的问题
  7. 断言(Assert)与异常(Exception)
  8. abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二)
  9. 用argparse解析布尔值
  10. 我可以在不提供FTP访问的情况下安装/更新WordPress插件吗?