在Eigen中,所有矩阵和向量均为Matrix模板类的对象,向量是矩阵的行(或列)为1是的特殊情况。

1、矩阵的三参数模板

Matrix类有六个模板参数,其中三个有默认值,因此只要学习三个参数就足够了。强制性的三参数模板的原型为:

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

三个参数分别表示:标量的类型,编译时的行,编译时的列。

typedef定义了很多模板,例如:Matrix4f 表示 4×44 \times 4 的floats 矩阵:

typedef Matrix<float, 4, 4> Matrix4f;

2、向量(Vectors)

向量是矩阵的特殊情况,也是用矩阵定义的。定义如下:

typedef Matrix<float, 3, 1> Vector3f;
typedef Matrix<int, 1, 2> RowVector2i;

3、特殊动态值(special value Dynamic)

Eigen的矩阵不仅能够在编译是确定大小(fixed size),也可以在运行时确定大小,就是所说的动态矩阵(dynamic size)。动态矩阵定义如下:

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

也可使用‘行’固定‘列’动态的矩阵:

Matrix<float, 3, Dynamic>

4、构造函数(Constructors)

可以使用默认的构造函数,不执行动态分配内存,也没有初始化矩阵参数:

Matrix3f a;
MatrixXf b;
  • a 是3-by-3矩阵,包含未初始化的 float[9] 数组
  • b是动态矩阵,当前大小为 0-by-0, 没有为数组的系数分配内存

矩阵的第一个参数表示“行”,数组只有一个参数。根据跟定的大小分配内存,但不初始化。

MatrixXf a(10,15);
VectorXf b(30);
  • a 是10-by-15阵,分配了内存,没有初始化
  • b是动态矩阵,当前大小为 30, 分配了内存,没有初始化

对于给定的矩阵,传递的参数无效,如:

Matrix3f a(3,3);

对于维数最大为4的向量,可以直接初始化:

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

5、系数访问

系数都是从0开始:

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{MatrixXd m(2,2);m(0,0) = 3;m(1,0) = 2.5;m(0,1) = -1;m(1,1) = m(1,0) + m(0,1);std::cout << "Here is the matrix m:\n" << m << std::endl;VectorXd v(2);v(0) = 4;v(1) = v(0) - 1;std::cout << "Here is the vector v:\n" << v << std::endl;
}

矩阵默认按列存储。
operator[] 在 vectors 中重载。matrix[i,j]和matrix[j]含义相同。

6、逗号分隔的初始化

Matrix3f m;
m << 1, 2, 3,4, 5, 6,7, 8, 9;
std::cout << m;

7、Resizing

可以用rows(), cols() and size() 改变现有矩阵的大小。这些类方法返回行、列、系数的数值。也可以用resize()来改变动态矩阵的大小。

EIgen:Matricx和vector类的定义和使用相关推荐

  1. vector在类内定义vector<int> vec(10,0); 报错原因分析

    注意使用的过程中别忘记: 添加头文件#include < vector >, 添加命名空间 using namespace std. 常用的函数的定义格式介绍: vector 类成员变量的 ...

  2. 【stanford C++】容器III——Vector类

    主要介绍如下5个容器类--Vector, Stack,Queue,Map和Set,各个都表示一重要的抽象数据类型.另外,各个类都是一些简单类型的值的集合,所以称它们为容器类. 暂且我们先不需要知道它们 ...

  3. C++ vector类详解

    转自http://blog.csdn.net/whz_zb/article/details/6827999 vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vec ...

  4. C++基础学习8:类的定义(class)

    先来说说C和C++中结构体的不同a) C语言中的结构体不能为空,否则会报错(??)b) C语言中内存为空结构体分配大小为0,C++中为结构体和类分配大小为1bytec) C语言中的结构体只涉及到数据结 ...

  5. 【C++入门】C++ vector类

    C++vector类 文章目录 C++vector类 一.vector定义 二.容器特性 1.顺序序列 2.动态数组 3.能够感知内存分配器的(Allocator-aware) 三.基本成员函数 1. ...

  6. 14 Java集合(集合框架+泛型+ArrayList类+LinkedList类+Vector类+HashSet类等)

    本篇主要是集合框架基础和List集合,Map集合等等后续更 集合 14.1 集合框架 14.1.1 概念 14.1.2 集合架构 14.2 Collection接口 14.2.1 常用方法 14.3 ...

  7. Qt (高仿Visio)流程图组件开发(三) 图元基类如何定义,流程图多种图元类型实现

    文章目录 本系列目录 前言 一.图元基类的定义 1.图元信息基类结构体 2.图元位置 3.父子对象关系 二.自定义图元实现 1.自定义图元基类(FlowchartGraphicsItem)与Qt原生图 ...

  8. c++ - 第9节 - vector类

    目录 1.标准库中的vector类 1.1.vector类 1.2.vector类的常用接口说明 1.3.vector类练习题 2.vector类的模拟实现 2.1.vector类源代码解析 2.2. ...

  9. C++初阶:vector类

    vector 0. vector的介绍 vector是用数组实现的.可变长度的顺序容器,本质是一种类模板. template < class T, // 元素类型class Alloc = al ...

最新文章

  1. pycharm pycharm中用matplolib的ax3.plot_surface画出的3D(三维图)(三维函数)不能旋转怎么办?
  2. 工控设备 如何将数据发送到串口_嵌入式无风扇工控机在水质监测系统中的应用...
  3. ACL 2019 | 图表示解决长文本关系匹配问题:腾讯提出概念交互图算法
  4. 机器学习性能度量(2):错误接受率 (FAR), 错误拒绝率(FRR),EER计算方法,python实现
  5. C语言之struct A *b和struct A c区别
  6. iOS开发基础知识--碎片27
  7. 两轮差速机器人舵机转轴示意图_灵活、快捷的机房巡检机器人少不了伺服电动轮...
  8. Git可视化工具-小乌龟
  9. MATLAB图像拼接算法及实现
  10. 32位版本的轻量级linux,适用于旧计算机的10种最佳轻量级Linux发行版
  11. Alsa 调试下篇:应用篇
  12. 数据分析的重要性分析
  13. 【深度学习】注意力机制
  14. h5 虚拟服务器,h5制作选择虚拟主机还是服务器
  15. 植物大战僵尸CE教程
  16. 基于PHP+小程序(MINA框架)+Mysql数据库的评选投票小程序系统设计与实现
  17. w10电脑c盘满了怎么清理_win10系统如何清理c盘空间容量
  18. 等候·《致我们终将逝去的青春》
  19. 2022年全球及中国植物精油行业头部企业市场占有率及排名调研报告
  20. Parameter Sharing Exploration and Hetero-center Triplet Loss

热门文章

  1. 递归和循环:斐波那契数列
  2. [School Life - Study] 有哪些每天坚持效果显著的高中学习习惯?
  3. JavaScript 闭包的详细分享(三种创建方式)(附小实例)
  4. 【废弃】【WIP】JavaScript 函数
  5. 【告别信】三年了,是该离开了!
  6. Esper系列(十二)Variables and Constants
  7. Java反编译Jar包和Android APK(类似.NET Reflector)
  8. Server Too Busy
  9. SpringSide 3 中的 Struts 2
  10. C语言经典例19-完数