Eigen 快速入门

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

矩阵定义

typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyMatrixType;
Matrix<double, 10, 5>   		//10行5列,数据类型为double
Matrix<double, 10, Dynamic>     //列数是动态的
Matrix<double, Dynamic, Dynamic> //行列都是动态的

简写方式:

原表达式 简写
Matrix<float, Dynamic, Dynamic> MatrixXf
Matrix<double, Dynamic, 1> VectorXd
Matrix<int, 1, Dynamic> RowVectorXi
Matrix<float, 3, 3> Matrix3f
Matrix<float, 4, 1> vector4f
#include <iostream>
#include "eigen_3_3_7/Eigen/Eigen"

int main()
{
    //typedef Matrix<float, Dynamic, Dynamic> MatrixXf;
    Eigen::MatrixXf matrix1(3,4); 		 //定义了矩阵的大小,但是没有初始化。
    //typedef Matrix<float, 3, 1> Vector3f;
    Eigen::Vector3f vector1;

    matrix1 = Eigen::MatrixXf::Zero(3,4); //对矩阵进行初始化,全0。
    vector1 = Eigen::Vector3f::Ones();	  //全1	

    std::cout << "------ matrix1 ------" << std::endl << matrix1 << std::endl;
    std::cout << "------ vector1 ------" << std::endl << vector1 << std::endl;
}

对固定大小(行,列已知)矩阵进行初始化

    Eigen::MatrixXf matrix1(3,4);  //已知矩阵大小
    Eigen::Vector3f vector1;

    matrix1 << 1, 2,  3,  4, 
               5, 6,  7,  8,
               9, 10, 11, 12;
    vector1 << 1, 2, 3;

单位矩阵

Matrix3d rotation_matrix = Matrix3d::Identity();

Matrix3d:Eigen库中typedef的数据类型,即“3*3矩阵(d表示矩阵内部数据类型为double类型)”

rotation_matrix:该3*3矩阵的变量名

Matrix3d::Identity():在定义该矩阵变量时,创建一个同尺寸同数据类型的单位阵,对其初始化。

Eigen的block操作(块操作)

在做GAMES101作业1的时候,看到有用到block操作

matrix.block(i,j,p,q)
p,q表示block的大小。
i,j表示从矩阵中的第几个元素开始向右向下开始算起
例如:

Eigen::MatrixXf m(3,4);
m<<1,   2,   3,   4,
   5,   6,   7,   8,
   9,  10,   11,  12,
   
m.block(0,0,1,1)=1

m.block(0,0,2,2)=
1   2
5   6

将 Eigen Vector4 类型转换为 Vector3

.head() 成员函数返回 vector 的前 n 个元素。如果 n 是一个编译时常量,那么您可以使用模板化变体(如下面的代码示例),Eigen 库将自动展开循环。

Eigen::Vector4f vec4;
// initialize vec4
Eigen::Vector3f vec3 = vec4.head<3>();

矩阵点乘、叉乘、转置、求逆、求和、行列式、迹、数乘

展示Eigen::Matrix矩阵运算,点乘、叉乘、转置、求逆、求和、行列式、迹、数乘等文章来源地址https://www.toymoban.com/news/detail-569447.html

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

int main(int argc, char** argv){
    // Eigen::Matrix为模板类,可自由定义不同维度的矩阵,
    // 此处仅展示较为常用的几种数据类型,其它定制化需求类型的使用,可以此类推;

    // 自定义创建4x4的矩阵,模板参数依次为:数据类型,行数,列数;
    Eigen::Matrix<float, 4, 4> matrix_4f;
    // 使用常数值进行初始化填充;
    matrix_4f = Eigen::Matrix<float,4,4>::Random();
    std::cout<<"matrix_4f random init:\n"<<matrix_4f<<std::endl<<std::endl;
    std::cout << "transpose:\n" << matrix_4f.transpose()<<std::endl<<std::endl;     // 转置
    std::cout << "sum: " << matrix_4f.sum()<<std::endl;                             // 各元素和
    std::cout << "det: " << matrix_4f.determinant()<<std::endl;                     // 行列式
    std::cout << "trace: " << matrix_4f.trace()<<std::endl<<std::endl;              // 迹
    std::cout << "times 10:\n" << 10 * matrix_4f<<std::endl<<std::endl;             // 数乘
    std::cout << "inverse:\n" << matrix_4f.inverse()<<std::endl<<std::endl;         // 逆
    
    
    // 3x1 列向量
    Eigen::Vector3f vector_3f(1.0f, 2.0f, 3.0f);
    std::cout<<"vector_3f:\n"<<vector_3f<<std::endl;

    Eigen::Vector3f vector_3f_tmp = Eigen::Vector3f::Constant(4.0f);
    std::cout<<"vector_3f_tmp:\n"<<vector_3f_tmp<<std::endl<<std::endl;

    // 点乘
    std::cout<<"vector_3f.dot(vector_3f_tmp): "<<(vector_3f.dot(vector_3f_tmp))<<std::endl<<std::endl;
    // 叉乘
    std::cout<<"vector_3f.cross(vector_3f_tmp):\n"<<(vector_3f.cross(vector_3f_tmp))<<std::endl<<std::endl;
    // 与矩阵变换
    Eigen::Matrix3f rotation = Eigen::Matrix3f::Random();
    std::cout<<"matrix transform:\n"<<(rotation*vector_3f)<<std::endl<<std::endl;
    

    return 0;
}
matrix_4f random init:
 -0.997497   0.170019    0.64568   0.421003
  0.127171 -0.0402539    0.49321  0.0270699
 -0.613392  -0.299417  -0.651784   -0.39201
  0.617481   0.791925   0.717887  -0.970031

transpose:
 -0.997497   0.127171  -0.613392   0.617481
  0.170019 -0.0402539  -0.299417   0.791925
   0.64568    0.49321  -0.651784   0.717887
  0.421003  0.0270699   -0.39201  -0.970031

sum: 0.0470595
det: 0.487613
trace: -2.65957

times 10:
 -9.97497   1.70019    6.4568   4.21003
  1.27171 -0.402539    4.9321  0.270699
 -6.13391  -2.99417  -6.51784   -3.9201
  6.17481   7.91925   7.17887  -9.70031

inverse:
-0.666487   0.21703  -0.55909 -0.057265
 0.610491  -3.01019  -1.01982  0.593088
 0.209112   1.78086  0.121229 0.0914626
 0.228898  -1.00139  -1.09875 -0.515468

vector_3f:
1
2
3
vector_3f_tmp:
4
4
4

vector_3f.dot(vector_3f_tmp): 24

vector_3f.cross(vector_3f_tmp):
-4
 8
-4

matrix transform:
 -4.4391
-1.28898
-3.86914

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

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

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

相关文章

  • games101 作业3

    1.项目才打开时无法运行。 解决方法: 切换成c++17 解决方法引用: Games101 作业3 环境问题 - 知乎  注:知乎里面的关于越界限制的控制不适用,虽然可以解决部分作业的问题,但是在bump里面依然会出现越界错误。应该用以下大佬的代码。  2.出现越界错误   解决方法: 在头

    2023年04月25日
    浏览(26)
  • GAMES101 作业0

    课上提供的环境是Linux, 还需要安装Vitrual Box和创建虚拟机,省事就直接在Windows系统下Visual Studio下操作了。 简单的环境配置: 下载Eigen 的库 在工程属性中添加目录: 2处地方 注意: 刚添加完后,我新建main.cpp后, 引入头文件 路径也没有设置错啊,但是就是找不到。 直到看

    2024年02月16日
    浏览(28)
  • Games101作业5解读

    在scene中加入两个球一个地板和两个点光源 在Render中我们从eye_pos向屏幕打出一根一根的ray与场景相交 第一步先与场景的求交,如果光线打到了物体,就继续判断打到的物体的材质,根据不同的材质进行不同的处理,这里重点说下REFLECTION和default 在REFLECTION中,这一段代码有点问

    2024年02月09日
    浏览(25)
  • GAMES101:作业3

    附其他所有作业超链接如下: Games101 作业0: 作业0 Games101 作业1: 作业1 Games101 作业2: 作业2 Games101 作业3: 作业3 Games101 作业4: 作业4 Games101 作业5: 作业5 Games101 作业6: 作业6 Games101 作业7: 作业7 完整代码获取途径: https://github.com/liupeining/Games_101_homework 照旧把这段代码

    2024年02月04日
    浏览(27)
  • GAMES101 作业1

    作业pa1对应的是GAMES101课程Lecture02到Lecture04这三节课的内容,主要是用于巩固空间中的物体投影到相机平面的整个过程。 说在前面,本文是在左手系下进行讨论的。 粗略地看一遍我们可以知晓main函数的流程: ①设定一些基本的初始参数并初始化源代码给出的 光栅化类raste

    2024年02月09日
    浏览(23)
  • GAMES101作业2

    在屏幕上画出一个实心三角形, 换言之,栅格化一个三角形。上一次作业中,在视口变化之后,我们调用了函数 rasterize_wireframe(const Triangle t)。但这一次,你需要自己填写并调用 函数 rasterize_triangle(const Triangle t)。 该函数的内部工作流程如下: 创建三角形的 2 维 bounding box。

    2024年02月16日
    浏览(30)
  • GAMES101:作业7记录

    在之前的练习中,我们实现了 Whitted-Style Ray Tracing 算法,并且用 BVH等加速结构对于求交过程进行了加速。在本次实验中,我们将在上一次实验的基础上实现完整的 Path Tracing 算法。至此,我们已经来到了光线追踪版块的最后一节内容。 请认真阅读本文档,按照本文档指示的流程完成

    2024年02月01日
    浏览(38)
  • GAMES101 OpenCV环境安装

    作业2中用到了OpenCV 下载OpenCV 源码 OpenCV 4.5.4 下载OpenCV_contrib OpenCV_contrib 4.5.4 注意:这两个源码的版本号要一致 将源码解压后,不要放在有中文路径的目录 使用管理员权限打开CMake, 一开始未使用,发现点击Configure时会报错,使用管理员权限打开CMake后,点击Configure未报错。

    2024年02月17日
    浏览(27)
  • Games101笔记-模型、视图、投影

    在旋转点,旋转矩阵的逆等于矩阵的转置 左边3*3是线性变换,右边一列是仿射变换(平移) 先线性再平移 x叉乘y得到z,y叉乘z得到x, xyz给任何两个可以得到另一个 (循环对称) z叉乘x得到y,所以y是反的 任意绕3d轴旋转可以分解为绕x,y,z轴旋转。三个角为欧拉角 罗德里格斯旋

    2024年03月19日
    浏览(39)
  • Games101学习笔记 - 变换矩阵基础

    缩放变换 : 1均匀缩放 2不均匀缩放 注意:上图是默认二维旋转的是以远点为圆转重心,并且逆时针旋转 旋转矩阵推导原理: 引入原因: 上面说了ax + by 的方式都可以写成矩阵的形式,但是平移的操作的公式如下,不能写成矩阵的形式。 只能写成如下: 为了同意变换,让他

    2024年02月15日
    浏览(21)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包