Eigen入门之密集矩阵 1 -- 类Matrix介绍

2023-10-30

简介

本篇介绍Eigen中的Matrix类。在Eigen中,矩阵和向量的类型都用Matrix来表示。向量是一种特殊的矩阵,其只有一行或者一列。

Matrix构造

Matrix.h中,定义了Matrix类,
其中的构造器包括如下的5个,可以看到定义Vector也是使用Matrix。


    /** \brief Constructs a fixed-sized matrix initialized with coefficients starting at \a data */
    EIGEN_DEVICE_FUNC
    explicit Matrix(const Scalar *data);


    /** \brief Constructs a vector or row-vector with given dimension. \only_for_vectors
      *
      * This is useful for dynamic-size vectors. For fixed-size vectors,
      * it is redundant to pass these parameters, so one should use the default constructor
      * Matrix() instead.
      * 
      * \warning This constructor is disabled for fixed-size \c 1x1 matrices. For instance,
      * calling Matrix<double,1,1>(1) will call the initialization constructor: Matrix(const Scalar&).
      * For fixed-size \c 1x1 matrices it is therefore recommended to use the default
      * constructor Matrix() instead, especially when using one of the non standard
      * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives).
      */
    EIGEN_STRONG_INLINE explicit Matrix(Index dim);

    /** \brief Constructs an initialized 1x1 matrix with the given coefficient */
    Matrix(const Scalar& x);
    /** \brief Constructs an uninitialized matrix with \a rows rows and \a cols columns.
      *
      * This is useful for dynamic-size matrices. For fixed-size matrices,
      * it is redundant to pass these parameters, so one should use the default constructor
      * Matrix() instead.
      * 
      * \warning This constructor is disabled for fixed-size \c 1x2 and \c 2x1 vectors. For instance,
      * calling Matrix2f(2,1) will call the initialization constructor: Matrix(const Scalar& x, const Scalar& y).
      * For fixed-size \c 1x2 or \c 2x1 vectors it is therefore recommended to use the default
      * constructor Matrix() instead, especially when using one of the non standard
      * \c EIGEN_INITIALIZE_MATRICES_BY_{ZERO,\c NAN} macros (see \ref TopicPreprocessorDirectives).
      */
    EIGEN_DEVICE_FUNC
    Matrix(Index rows, Index cols);
    
    /** \brief Constructs an initialized 2D vector with given coefficients */
    Matrix(const Scalar& x, const Scalar& y);


    //......

简化Matrix和Vector定义

还有使用macro定义的一些简化类名定义,用于固定column 或者Row的方阵,以及向量。比如在一些项目中看到的 Matrix3f, Matrix4i, Vector4f……。

这些macro如下:


#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \
/** \ingroup matrixtypedefs */                                    \
typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix;  \
/** \ingroup matrixtypedefs */                                    \
typedef Matrix<Type, Size, 1>    Vector##SizeSuffix##TypeSuffix;  \
/** \ingroup matrixtypedefs */                                    \
typedef Matrix<Type, 1, Size>    RowVector##SizeSuffix##TypeSuffix;

#define EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size)         \
/** \ingroup matrixtypedefs */                                    \
typedef Matrix<Type, Size, Dynamic> Matrix##Size##X##TypeSuffix;  \
/** \ingroup matrixtypedefs */                                    \
typedef Matrix<Type, Dynamic, Size> Matrix##X##Size##TypeSuffix;

如上的定义,则有:


// 定义一个浮点型的4X4的方阵类型。
typedef Matrix<float, 4, 4> Matrix4f;

// 定义一个浮点型的3行的列向量类型。
typedef Matrix<float, 3, 1> Vector3f;

// 定义一个整形的长度为2的行向量类型。
typedef Matrix<int, 1, 2> RowVector2i;

特殊值 Dynamic

上面都是固定大小的矩阵或者向量。Eigen不仅支持在编译时指定了维度的矩阵Matrix,而且支持使用一个特殊值Dynamic来指定Rows或(和)Columns,指示编译时大小并不知道。而在运行时,才会真正地处理其大小尺寸。

template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
class Matrix
  : public PlainObjectBase<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >

就如上面固定大小的矩阵,有其简化定义形式。Dynamic指示的非固定的Matrix也有简化定义形式。如:

// 定义一个double型的,行数和列数均编译时未知的Matrix。
typedef Matrix<double, Dynamic, Dynamic> MatrixXd;

// 定义一个向量,但编译时还不知道其长度。
typedef Matrix<int, Dynamic, 1> VectorXi;

当然行数或者列数可以知道其中之一。如下:

Matrix<float, 3, Dynamic> matrixA;

Matrix<float, Dynamic, 4> matrixB;

示例

如下示例,使用构造器定义一下Matrix

使用默认构造器

这时,不会执行内存分配,也不会初始化矩阵参数,仅定义了一个Matrix变量。


Matrix3f a;
MatrixXf b;

构造器指定大小尺寸

此时,指定了大小,将分配内存空间,但是并不初始化各个矩阵或者向量参数。


MatrixXf a(8,15);

VectorXf b(30);

Eigen中提到,为统一固定大小或者Dynamic类型的Matrix的定义,可以在构造器参数中指定大小值,但这些值可能并不需要,也没有用处。比如:

// 这里构造器上的rows =3, columns = 3并不需要
Matrix3f a(3,3);

指定Matrix系数的构造器

对具有较少系数的Matrix,可以在构造时指定这些系数。比如:


// 定义具有长度为2的整形向量
Vector2i a(5, 6);

// 定义具有长度为3的double型向量
Vector3d b(5.0, 6.0, 7.0);

// 定义具有长度为4的浮点向量
Vector4f c(5.0, 6.0, 7.0, 8.0);

对Matrix的系数访问

在使用Matrix或者Vector时,一定要有系数Coefficient。如何操作/访问这些系数呢?

Matrix类重载了括号操作符(),提供对系数的访问。针对矩阵,参数为(row, column),而针对Vector,则只有一个参数index了。这些参数都是以0作为起始的整数。

注意:
对矩阵访问,单个参数也是允许的,但其操作是按照矩阵的系数数组来进行操作的。而这会有个内存存储顺序的问题,Eigen按照Column为主的顺序进行存储,但可以更改设置,变为以Row为主序。

如有有源程序 matrix_1.cpp:

#include <iostream>
#include <Eigen/Dense>

using namespace Eigen;

int main()
{
  // 定义matrix
  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 << "The matrix m:\n" << m << std::endl;

  std::cout << "The matrix m(1):\n" << m(1) << std::endl;

  // 定义vector
  VectorXd v(2);
  v(0) = 4;
  v(1) = v(0) - 1;
  std::cout << "The vector v:\n" << v << std::endl;
}


编译:

$ g++ matrix_1.cpp -o matrix_1  -I /usr/local/include/eigen3
$ 

输出:

$ ls matrix_1
The matrix m:
  3  -1
2.5 1.5
The matrix m(1):
2.5
The vector v:
4
3

初始化: Comma_initializtion

在Eigen内,使用comma-initializer的语法来进行matrix、vector的初始化。

**注意:**使用comma-initializer来初始化matrix时,是以row为主序来进行输入的。这和上面提到的访问时的顺序可能不一致。
如下的示例:

// matrix_2.cpp
#include <iostream>
#include <Eigen/Dense>

using namespace Eigen;

int main()
{
  // 定义matrix
  Matrix3f m;
  m << 1, 2, 3,
       4, 5, 6,
       7, 8, 9;
  std::cout << "The matrix m:\n" << m << std::endl;

  // 定义vector
  VectorXd v(2);
  v<< 1,2;
  
  std::cout << "The vector v:\n" << v << std::endl;
}

编译一下,执行后,可以看到结果。

$ g++ matrix_2.cpp -o matrix_2 -I /usr/local/include/eigen3
$ ./matrix_2
The matrix m:
1 2 3
4 5 6
7 8 9
The vector v:
1
2

size及赋值

对一个matrix的row,column数量的访问,Eigen中的Matrix提供了row(), columns(), size()函数。

Matrix<double, 4, 3> m;
std::cout << "rows: " << m.rows() ;                     //  rows: 4
std::cout << "columns: " << m.cols() << std::endl;       //  columns: 3

std::cout << "It has " << m.size() << " coefficients" << std::endl;     // It has 12 coefficients

对一个Matrix的大小可以使用resize(int rows,int columns)来修改其大小。

Matrix<double, 4, 3> m;

可以把一个Matrix/Vector变量赋值给另一个对应的变量,而对他们的Size并没有限制,如:

Matrix4d md4;
Matrix2f mf2;

mf2 = md4;
mf2.size();

resize & conservativeResize

只有Dynamic类型的Matrix可以改变大小。固定大小的matrix调用resize,执行时也会出错。


    MatrixXf a(2,2);
    a.resize(5,5);

resize()一个matrix,可以想象,其系数可能会发生变化,所以此函数是有破坏性的。Eigen中还提供了conservativeResize()函数,用于保护其系数。

对比 fixed、Dynamic对matrix的大小影响

有这样一个问题: 我们应该使用固定大小的matrix、还是选择使用不固定的Dynamic大小的matrix呢?Eigen官方对此问题的答案是: 如果你的matrix尺寸大小很小,不超过16,就使用固定尺寸的,否则使用浮动的不固定尺寸的matrix。固定大小尺寸的matrix有性能上的极大优势。因为在内部实现上,固定尺寸大小的matrix简单地使用了数组Array来管理系数。而使用Dynamic的matrix,会使用动态内存分配,而且存在系数访问时的展开位计算。

比如:Matrix4f mymatrix;就相当于float mymatrix[16];;而MatrixXf mymatrix(rows,columns); 相当于float *mymatrix = new float[rows*columns];

可选构造器参数

模板类Matrix,保护了6个参数,后3个参数具有缺省的参数,如下:

Matrix<typename Scalar,
       int RowsAtCompileTime,
       int ColsAtCompileTime,
       int Options = 0,
       int MaxRowsAtCompileTime = RowsAtCompileTime,
       int MaxColsAtCompileTime = ColsAtCompileTime>
  • Options参数
    这个参数使用使用bit为标识的一些选项。这里只介绍一下最重要的RowMajor,其标识Matrix使用行优先策略来存储系数数据。缺省下,其值为0,为列优先(column-major)策略。
  • MaxRowsAtCompileTime 和 MaxColsAtCompileTime
    在你不知道matrix具体大小时,但知道你大小的最大尺寸,使用此参数来指定编译时其最大值。如果合适,Eigen会创建固定尺寸大小的Matrix来替代。

简化Matrix类名

在第一篇中,介绍了使用Macro定义了一些简化Matrix类型和类名。

  • MatrixNt --> Matrix<type, N, N>. 比如: MatrixXi 即为 Matrix<int, Dynamic, Dynamic>.
  • VectorNt --> Matrix<type, N, 1>. 比如: Vector2f 即为 Matrix<float, 2, 1>.
  • RowVectorNt --> Matrix<type, 1, N>. 比如: RowVector3d 即为 Matrix<double, 1, 3>.

这里的

  • N 表示数量,可以1,2,3……,或者代表Dynamic的不固定大小的X
  • t 表示系数的数据类型,可以是 i(int), f(float), d(double), cf(complex) cd(complex)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eigen入门之密集矩阵 1 -- 类Matrix介绍 的相关文章

  • 如何在 MATLAB 中将矩阵元素除以列总和?

    有没有一种简单的方法可以将每个矩阵元素除以列和 例如 input 1 4 4 10 output 1 5 4 14 4 5 10 14 以下是执行此操作的不同方法的列表 使用bsxfun https www mathworks com he
  • 模板成员函数和 std::invocable 的 C++20 概念中的错误

    我正在尝试 C 20 概念和本征库 https eigen tuxfamily org index php title Main Page 我发生了意想不到的行为 具体来说 考虑以下概念 要求类型可以通过以下任一方式调用 Eigen Mat
  • scipy 将一个稀疏矩阵的所有行附加到另一个稀疏矩阵

    我有一个 numpy 矩阵 想在其中附加另一个矩阵 这两个矩阵的形状为 m1 shape 2777 5902 m2 shape 695 5902 我想将 m2 附加到 m1 以便新矩阵的形状为 m new shape 3472 5902 当
  • Python模糊字符串匹配作为相关样式表/矩阵

    我有一个文件 其中包含 x 个字符串名称及其关联的 ID 本质上是两列数据 我想要的是一个格式为 x by x 的相关样式表 将相关数据作为 x 轴和 y 轴 但我想要 fuzzywuzzy 库的函数 fuzz ratio x y 作为输出
  • 反转或点 kxnxn 矩阵的快速方法

    有没有一种快速方法可以使用 numpy 计算 kxnxn 矩阵的逆矩阵 在每个 k 切片处计算逆矩阵 换句话说 有没有办法矢量化下面的代码 gt gt gt from numpy linalg import inv gt gt gt a r
  • 用矩阵变换 3D 向量的方法

    我一直在阅读一些关于用矩阵转换 Vector3 的文章 并且正在努力深入研究数学并自己编码 而不是使用现有代码 无论出于何种原因 我的学校课程从未包含矩阵 所以我正在填补我的知识空白 值得庆幸的是 我认为我只需要一些简单的东西 背景是我正在
  • 使用定制距离函数从 Pandas Dataframe 创建距离矩阵

    我有一个包含两列的 Pandas 数据框 id 唯一标识符 和 date 如下所示 test df head id date 0 N1 2020 01 31 1 N2 2020 02 28 2 N3 2020 03 10 我创建了一个自定义
  • python中的张量点运算

    我有两个数组A 1 2 3 and B 1 0 1 0 问题是如何在 python 中执行张量点积 我期待得到 C 1 2 3 0 0 0 1 2 3 0 0 0 函数 np tensordot 返回有关数组形状的错误 对这个问题稍微补充一
  • 在 R 中计算大矩阵的零空间

    我找不到任何函数或包来计算 a 的零空间或 QR 分解 bigmatrix from library bigmemory 在 R 中 例如 library bigmemory a lt big matrix 1000000 1000 typ
  • C / C++ 中简单快速的矩阵向量乘法

    我需要经常使用matrix vector mult 它将矩阵与向量相乘 下面是它的实现 问题 有没有一种简单的方法可以使其速度显着加快至少两倍 备注 1 矩阵大小约为300x50 期间不会改变 跑步 2 它必须在 Windows 和 Lin
  • 如何在 NumPy 中连接两个一维数组?

    我有两个数组A a1 an and B b1 bn 我想得到新的矩阵 C 等于 a1 b1 a2 b2 an bn 我该如何使用numpy concatenate 这个怎么样 很简单但是fastest解决方案 In 73 a np arra
  • 特征矩阵库逐系数模运算

    在我正在开发的项目的一个函数中 我需要找到特征库矩阵的每个元素除以给定数字后的余数 这是与我想要做的等效的 Matlab mod X num 其中 X 是被除数矩阵 num 是除数 实现这一目标的最简单方法是什么 您可以使用 C 11 la
  • 在c中用以下结构填充矩阵

    我有以下结构 typedef struct arr integer int size int arr arr arr integer arr arr integer alloc arr integer int len arr arr int
  • 计算带状矩阵的 colCumsums 的更快替代方案

    我是 R 和 stats 的新手 在我当前工作的领域中 我需要以独特的方式计算累积列总和 最初提供宽度为 b 行数为 n 的方带矩阵 例如 n 8 且 b 3 0 1 2 7 0 0 0 0 0 0 3 6 7 0 0 0 0 0 0 3
  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩
  • 对二进制二维矩阵进行排序?

    我在这里寻找一些指示 因为我不太知道从哪里开始研究这个 我有一个二维矩阵 每个单元格中有 0 或 1 例如 1 2 3 4 A 0 1 1 0 B 1 1 1 0 C 0 1 0 0 D 1 1 0 0 我想对其进行排序 使其尽可能 上三角
  • 通过 mpreal.h 求解具有长整数参数的非线性方程时的精度损失

    我有一个数值计算问题 需要以多精度求解非线性方程 具有长整数 我尝试了 Pavel 链接中的 MPFR C 包装器 Pavel 的 mpfr C 包装器 http www holoborodko com pavel mpfr 包装器可以在这
  • 如何找到平面和 3d 矩阵之间的交平面

    如果我有一堆图像并且尺寸如下 size M 256 256 124 我有 3 个点 它们的坐标是 coor a 100 100 124 coor b 256 156 0 coor c 156 256 0 如何创建 M 与这 3 个点定义的平
  • 如何使用 MPI_Scatterv 将矩阵的行发送到所有进程?

    我正在使用 MPI 接口 我想分割一个矩阵 按行 并将各个部分分配给每个进程 例如 我有这个7x7的方阵M M 0 00 1 00 2 00 3 00 4 00 5 00 6 00 7 00 8 00 9 00 10 00 11 00 12
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct

随机推荐

  • 生命在于磨炼——连续两年参加4C大赛心得

    一 4C大赛简介 1 大赛简介 中国大学生计算机设计大赛 下面简称 大赛 是由教育部高等学校计算机类专业教学指导委员会 教育部高等学校软件工程专业教学指导委员会 教育部高等学校大学计算机课程教学指导委员会 教育部高等学校文科计算机基础教学指
  • 操作系统笔记五(Linux存储管理)

    1 Buddy内存管理算法 内部碎片就是已经被分配出去 能明确指出属于哪个进程 却不能被利用的内存空间 外部碎片指的是还没有被分配出去 不属于任何进程 但由于太小了无法分配给申请内存空间的新进程的内存空闲区域 目的 努力让内存分配与相邻内存
  • Task2_MySQL_basic

    MySQL表数据类型 用SQL语句创建表 创建MySQL数据表需要以下信息 表名 表字段名 定义每个表字段 语句解释 设定列类型 大小 约束 设定主键 用SQL语句向表中添加数据 语句解释 多种添加方式 指定列名 不指定列名 用SQL语句删
  • Ubuntu16.04下搭建LAMP环境

    Ubuntu16 04下搭建LAMP环境 Ubuntu16 04下搭建LAMP环境 1 安装 Apache2 2 重启 apache2 3 测试apache2是否安装成功 4 安装php7 5 测试php是否安装成功 6 安装mysql数据
  • 序列化与反序列化之Flatbuffers(一):初步使用

    序列化与反序列化之Flatbuffers 一 初步使用 一 前言 在MNN中 一个训练好的静态模型是经过Flatbuffers序列化之后保存在硬盘中的 这带来两个问题 1 为什么模型信息要序列化不能直接保存 2 其他框架如caffe和onn
  • 深度学习在目标视觉检测中的应用进展与展望

    前言 文章综述了深度学习在目标视觉检测中的应用进展与展望 首先对目标视觉检测的基本流程进行总结 并介绍了目标视觉检测研究常用的公共数据集 然后重点介绍了目前发展迅猛的深度学习方法在目标视觉检测中的最新应用进展 最后讨论了深度学习方法应用于目
  • ORAN专题系列-0: O-RAN快速索引

    专题一 O RAN的快速概述 ORAN专题系列 1 什么是开放无线接入网O RAN ORAN专题系列 1 什么是开放无线接入网O RAN 文火冰糖的硅基工坊的博客 CSDN博客 什么是oran ORAN专题系列 2 O RAN的系统架构 O
  • C和C++安全编码笔记:动态内存管理

    4 1 C内存管理 C标准内存管理函数 1 malloc size t size 分配size个字节 并返回一个指向分配的内存的指针 分配的内存未被初始化为一个已知值 2 aligned alloc size t alignment siz
  • Spring Aop自定义注解用在Controller层

    前提项目用的框架是SpringMVC 切面类 Aspect Component 把这个注掉是为了不让Spring中扫描 应该让SpringMVC扫描 public class SysLogAop Pointcut annotation co
  • 图像识别毕业设计 opencv实现植物识别算法系统 - python 深度学习

    文章目录 0 前言 2 相关技术 2 1 VGG Net模型 2 2 VGG Net在植物识别的优势 1 卷积核 池化核大小固定 2 特征提取更全面 3 网络训练误差收敛速度较快 3 VGG Net的搭建 3 1 Tornado简介 1 优
  • Maven项目的jdk版本修改

    Maven项目的jdk版本修改 修改的办法有以下三种 一 选择项目 gt 右键 gt build path Configure build path 选择旧的jre 1 5 gt remove删除 gt add Library 添加新的jr
  • Activity 工作流引擎

    Activiti工作流引擎使用详解 http blog csdn net m0 37327416 article details 71743368 Activity用户手册 http www mossle com docs activiti
  • SpringBoot笔记:SpringBoot 集成 Dataway(一)

    文章目录 1 什么是 Dataway 2 主打场景 3 技术架构 4 整合SpringBoot 4 1 maven 依赖 4 2 初始化脚本 4 3 整合 SpringBoot 5 Dataway 接口管理 6 Mybatis 语法支持 7
  • Kafka3.0.0版本——文件清理策略

    目录 一 文件清理策略 1 1 文件清理策略的概述 1 2 文件清理策略的官方文档 1 3 日志超过了设置的时间如何处理 1 3 1 delete日志删除 将过期数据删除 1 3 2 compact日志压缩 一 文件清理策略 1 1 文件清
  • 【Pytorch】利用Pytorch+GRU实现情感分类(附源码)

    在这个实验中 数据的预处理过程以及网络的初始化及模型的训练等过程同前文 利用Pytorch LSTM实现中文新闻分类 具体这里就不再重复解释了 如果有读者在对数据集的预处理过程中有疑问 请参考我的其他博客 里面对这些方法均有我的一些个人体会
  • 稀缺原理

    不管是什么东西 只要你晓得会失去它 自然就会爱上它了 稀缺原理 机会越少见 价值似乎就越高 对失去某种东西的恐惧似乎比对获得同一物品的渴望 更能激发人们的行动力 稀缺原理的力量来源 1 基本可以根据获得一样东西的难易程度 迅速 准确的判断它
  • plsql developer 终极注册码

    product code 4v6hkjs66vc944tp74p3e7t4gs6duq4m4szbf3t38wq2 serial number 1412970386 password xs374ca 手机扫一扫 欢迎关注公众号 关注程序员成
  • python:从键盘输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,则不转换。然后输出最后得到的字符。

    letter str input 请输入一个字母 if letter lt Z 凡是小于大写Z的都要转换成小写 print 转换小写字母为 letter lower lower 方法可以把大写转换成小写 else print 转换大写字母为
  • 网络协程编程

    一 背景 为什么需要网络协程 1 协程 纤程并不是一个新概念2 大并发 高性能对于服务端的高要求3 移动设备的快速增长加大了服务端大并发压力4 Go 语言的兴起将协程带到了一个新的高度支持协程的编程语言 1 Go 语言 非常容易支持大并发
  • Eigen入门之密集矩阵 1 -- 类Matrix介绍

    简介 本篇介绍Eigen中的Matrix类 在Eigen中 矩阵和向量的类型都用Matrix来表示 向量是一种特殊的矩阵 其只有一行或者一列 Matrix构造 在Matrix h中 定义了Matrix类 其中的构造器包括如下的5个 可以看到