Eigen 矩阵Matrix及其简单操作

这篇具有很好参考价值的文章主要介绍了Eigen 矩阵Matrix及其简单操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. Matrix类

在Eigen,所有的矩阵和向量都是Matrix模板类的对象,Vector只是一种特殊的矩阵(一行或者一列)。
Matrix有6个模板参数,主要使用前三个参数,剩下的有默认值。

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

Scalar是表示元素的类型,RowsAtCompileTime为矩阵的行,ColsAtCompileTime为矩阵的列。

库中提供了一些类型便于使用,比如:

typedef Matrix<float, 4, 4> Matrix4f;

2. Vectors向量

列向量

typedef Matrix<float, 3, 1> Vector3f;

行向量文章来源地址https://www.toymoban.com/news/detail-519562.html

typedef Matrix<int, 1, 2> RowVector2i;
一、矩阵的定义
Matrix<double, 3, 3> A;                // A.定义3x3double 矩阵
Matrix<double, 3, Dynamic> A;          //定义3xn double 矩阵,列为动态变化
Matrix<double, Dynamic, Dynamic>  A;   // 定义 double 矩阵,行、列为动态变化,由需要决定
MatrixXd A;                            // 定义 double 矩阵,行、列为动态变化,由需要决定
Matrix<double, 3, 3, RowMajor>  A;     // 定义3x3 double 矩阵,按行储存,默认按列储存效率较高。
Matrix3f  A;                           // 定义3x3 float 矩阵A.
Vector3f  A;                           // 定义3x1 float 列向量A.
VectorXd  A;                           // 定义动态double列向量A
RowVector3f  A;                        // 定义1x3 float 行向量A.
RowVectorXd  A;                        // 定义动态double行向量A.

二、基础用法
// Eigen        // Matlab           // comments
A.size()        // length(x)        // 元素个数
C.rows()        // size(C,1)        // 行个数
C.cols()        // size(C,2)        // 列个数

A(i)            // x(i+1)           // 默认情况下列优先,访问(0,i)的元素
C(i, j)         // C(i+1,j+1)       //访问(i, j)的元素。
A.resize(4, 4);       // 运行时,如果之前已经定义过形状则会报错。
B.resize(4, 9);       // 运行时,如果之前已经定义过形状则会报错。
A.resize(3, 3);       // Ok; size didn't change.
B.resize(3, 9);       // Ok; only dynamic cols changed.
 
A << 1, 2, 3,     // Initialize A. The elements can also be
     4, 5, 6,     // matrices, which are stacked along cols
     7, 8, 9;     // and then the rows are stacked.
B << A, A, A;     // B is three horizontally stacked A's.
A.fill(10);       // Fill A with all 10's.

三、特殊矩阵定义
// Eigen                                                
//单位矩阵定义
MatrixXd::Identity(rows,cols)       
C.setIdentity(rows,cols)            
//零矩阵定义
MatrixXd::Zero(rows,cols)          
C.setZero(rows,cols)              
//全1矩阵定义
MatrixXd::Ones(rows,cols)         
C.setOnes(rows,cols)               
//随即矩阵定义
MatrixXd::Random(rows,cols)            
C.setRandom(rows,cols)          
//线性阵定义
VectorXd::LinSpaced(size,low,high)  
v.setLinSpaced(size,low,high)     

四、矩阵分块
// 下面x为列或行向量,P为矩阵
**************************只能对向量操作************************************
x.head(n)                          // 列向量的前n个元素
x.head<n>()                        // 行向量的前n个元素
x.tail(n)                          // 列向量的倒数n个元素
x.tail<n>()                        // 行向量的倒数n个元素
x.segment(i, n)                    // 行向量从i开始的n个元素
x.segment<n>(i)                    // 列向量从i开始的n个元素
**************************只能对矩阵操作******************************************
P.block(i, j, rows, cols)          // 从i行j列开始的rows行cols列块。
P.block<rows, cols>(i, j)          //  从i行j列开始的rows行cols列块
P.row(i)                           // 矩阵P的第i行元素
P.col(j)                           // 矩阵P的第j列元素
P.leftCols<cols>()                 // P矩阵左边cols列元素
P.leftCols(cols)                   //P矩阵左边cols列元素
P.middleCols<cols>(j)              // P矩阵第j列开始的cols列元素
P.middleCols(j, cols)              // P矩阵第j列开始的cols列元素
P.rightCols<cols>()                // P矩阵右边cols列元素
P.rightCols(cols)                  // P矩阵右边cols列元素
P.topRows<rows>()                  // P矩阵前rows行元素
P.topRows(rows)                    // P矩阵前rows行元素
P.middleRows<rows>(i)              // P矩阵第i行开始的row行元素
P.middleRows(i, rows)              // P矩阵第i行开始的row行元素
P.bottomRows<rows>()               // P矩阵倒数row行
P.bottomRows(rows)                 // P矩阵倒数row行
P.topLeftCorner(rows, cols)        // P矩阵左上角rows行,cols列元素
P.topRightCorner(rows, cols)       // P矩阵右上角rows行,cols列元素
P.bottomLeftCorner(rows, cols)     
P.bottomRightCorner(rows, cols)    
P.topLeftCorner<rows,cols>()       
P.topRightCorner<rows,cols>()      
P.bottomLeftCorner<rows,cols>()    
P.bottomRightCorner<rows,cols>()   

五、矩阵元素交换                      
R.row(i) = P.col(j);    //可以将P的列元素去替换R的行元素
R.col(j1).swap(P.col(j2));  //将P的列元素和R的列元素进行互换


六、矩阵转置                       
R.adjoint()                        // R矩阵的伴随矩阵
R.transpose()                      // R矩阵的转置
R.diagonal()                       // R矩阵的迹,用列表示
x.asDiagonal()                     // 对角矩阵
R.reverse()                        // R矩阵逆时针旋转180度(反转)
R.colwise().reverse(); 			// R矩阵的列反转
R.rowwise().reverse(); 			// R矩阵的行反转
R.transpose().colwise().reverse(); // R矩阵逆时针旋转90度
R.transpose().rowwise().reverse(); // R矩阵顺时针旋转90度
R.conjugate()                      // conj(R)共轭矩阵


七、矩阵乘积
// Matrix-vector.  Matrix-matrix.   Matrix-scalar.
y  = M*x;          R  = P*Q;        R  = P*s;
a  = b*M;          R  = P - Q;      R  = s*P;
a *= M;            R  = P + Q;      R  = P/s;
                   R *= Q;          R  = s*P;
                   R += Q;          R *= s;
                   R -= Q;          R /= s;

八、矩阵内部元素操作
// Vectorized operations on each element independently
// Eigen                  // Matlab
R = P.cwiseProduct(Q);    // R = P .* Q对应点乘
R = P.array() * s.array();// R = P .* s对应点乘
R = P.cwiseQuotient(Q);   // R = P ./ Q对应点除
R = P.array() / Q.array();// R = P ./ Q对应点除
R = P.array() + s.array();// R = P + s  对应点加
R = P.array() - s.array();// R = P – s  对应点减
R.array() += s;           // R = R + s
R.array() -= s;           // R = R - s
R.array() < Q.array();    // R < Q  //Q矩阵元素比较,会在相应位置置0或1
R.array() <= Q.array();   // R <= Q //Q矩阵元素比较,会在相应位置置0或1
R.cwiseInverse();         // 1 ./ P   //1点除以P
R.array().inverse();      // 1 ./ P   //1点除以P
R.array().sin()           // sin(P)
R.array().cos()           // cos(P)
R.array().pow(s)          // P .^ s
R.array().square()        // P .^ 2
R.array().cube()          // P .^ 3
R.cwiseSqrt()             // sqrt(P)
R.array().sqrt()          // sqrt(P)
R.array().exp()           // exp(P)
R.array().log()           // log(P)
R.cwiseMax(P)             // max(R, P) //max(R, P) 对应取大
R.array().max(P.array())  // max(R, P) //min(R, P) 对应取小
R.cwiseMin(P)             // min(R, P)
R.array().min(P.array())  // min(R, P)
R.cwiseAbs()              // abs(P)
R.array().abs()           // abs(P)
R.cwiseAbs2()             // abs(P.^2)
R.array().abs2()          // abs(P.^2)
(R.array() < s).select(P,Q);  // (R < s ? P : Q)
附:
要取得[a,b)的随机整数,使用(rand() % (b-a))+ a;

要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;

要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;

通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。

要取得a到b之间的随机整数,另一种表示:a + (int)b * rand() / (RAND_MAX + 1)。

要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。

到了这里,关于Eigen 矩阵Matrix及其简单操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Eigen中文文档] 稀疏矩阵操作

    文档总目录 英文原文(Sparse matrix manipulations) 处理和解决稀疏问题涉及各种模块,总结如下: 模块 头文件 内容 SparseCore #includeEigen/SparseCore SparseMatrix和SparseVector类、矩阵集合、基本稀疏线性代数(包括稀疏三角求解器) SparseCholesky #includeEigen/SparseCholesky 直接稀疏LLT和LDLT Chole

    2024年02月10日
    浏览(54)
  • Eigen线性代数库学习大全

            Eigen是C++的线性代数库,能提供有关矩阵的线性代数运算,还包含解方程等功能。 目录 0、Eigen库结构导图 1、Eigen库安装 2、Eigen库矩阵基础(参考) 2.1 矩阵模板函数        2.2 类型 2.3 赋值与访问 2.4 调整与操作  2.4 运算 2.5 解方程  3、Eigen库的向量基础 3.1 类型与

    2024年02月16日
    浏览(45)
  • [Eigen中文文档] 线性代数与分解

    文档总目录 英文原文(Linear algebra and decomposition) 本节说明如何求解线性系统,计算各种分解,如 LU 、 QR 、 SVD 、 特征分解 …… 求解基本线性系统 问题 :有一个方程组,写成矩阵方程如下: A x = b Ax = b A x = b 其中 A A A 和 b b b 是矩阵(作为一种特殊情况, b b b 也可以是一个

    2024年02月07日
    浏览(43)
  • SLAM——Eigen函数库之矩阵块运算,高阶操作middleCols与segment用法

    Eigen/四元数/欧拉角/旋转矩阵 相关系列文章 Eigen/Matlab 使用小结 SLAM——之Eigen入门(矩阵运算及几何模块) SLAM——之Eigen函数库,一个相对复杂的EIgen使用实例 SLAM——Eigen函数库:矩阵块运算,block操作 SLAM——Eigen函数库之 Eigen::Ref 使用实例 欧拉角和旋转矩阵相互转换 四元数

    2024年02月10日
    浏览(43)
  • pytorch3d旋转矩阵转四元数transforms.matrix_to_quaternion函数隐藏的大坑及其解决方法

      在pytorch旋转矩阵转四元数及各种旋转表示方式之间的转换实现代码这篇博客里,我提到可以使用pytorch3d实现批量旋转表示方法之间的转换。但是最近在使用它的matrix_to_quaternion函数的时候,发现了一个隐藏的巨大bug:它不会确保输出的四元数中的那个实数w恒为正。这样就

    2024年02月13日
    浏览(50)
  • Eigen-高级矩阵初始化

    Eigen提供了一个逗号初始化语法,允许用户轻松设置矩阵、向量或数组的所有系数。简单地列出系数,从左上角开始,从左到右,从上到下。对象的大小需要事先指定。如果你列出的系数太少或太多,Eigen就会报错。 此外,初始化列表的元素本身可以是向量或矩阵。 一个常见

    2024年04月27日
    浏览(41)
  • [Eigen中文文档] 矩阵与向量运算

    专栏总目录 英文原文(Matrix and vector arithmetic) 本文章旨在提供有关如何使用 Eigen 在矩阵、向量和标量之间执行算术操作的概述和一些详细信息。 介绍 Eigen 通过重载常见的 C++ 算术运算符(如 + 、 - 、 * )或通过特殊方法(如 dot() 、 cross() 等)提供矩阵/向量算术运算。对于

    2024年01月24日
    浏览(48)
  • eigen旋转矩阵与欧拉角的转换

    2024年02月11日
    浏览(47)
  • c++矩阵计算性能对比:Eigen和GPU

    生成随机矩阵 生成随机矩阵有多种方式,直接了当的方式是使用显式循环的方式为矩阵的每个元素赋随机值。 另一种方式是使用Eigen库,它提供了矩阵运算的库。 生成随机矩阵: 计算矩阵点积 使用显式循环计算 直接上代码: 使用Eigen库 代码: 使用GPU 代码片断: 结果分析

    2024年02月12日
    浏览(38)
  • Eigen 对矩阵的每个元素取绝对值

      使用Eigen库对矩阵的每一个元素进行取绝对值操作非常简单。可以使用array()函数将矩阵转换为数组,然后使用abs()函数对数组中的每个元素取绝对值,最后使用matrix()函数将数组转换回矩阵。下面是一个示例代码:

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包