eigen库的使用_sfml是什么库

eigen库的使用_sfml是什么库Eigen是开源的C++线性代数库,常用在计算机图形学中。有份英文的Eigen使用手册,简要整理一下#include<Eigen/Core>创建新矩阵的时候如下Matrix3fA;Matrix4dB;这里的命名有一个便利性,比如A的类型是Matrix3f,就表示A是3x3float型矩阵,同理B是4x4double型矩阵。但并不是所有组合都work的,比如Matrix5s就会报错(虽然想的是5x5short);也不是必须是正方形的矩阵。那如果想用5x5shor

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Eigen是开源的C++线性代数库,常用在计算机图形学中。
有份英文的Eigen使用手册,简要整理一下

安装

$ cd ~
$ git clone https://github.com/eigenteam/eigen-git-mirror

Eigen所有的文件都是h文件,只需include即可使用,
但是要告诉编译器它在哪个位置。

$ sudo ln -s /usr/local/include ~/eigen-git-mirror/Eigen

使用

#include <Eigen/Core>

创建新矩阵的时候如下

Matrix3f A;
Matrix4d B;

这里的命名有一个便利性,比如A的类型是Matrix3f,就表示A是3×3 float型矩阵,
同理B是4×4 double型矩阵。
但并不是所有组合都work的,比如Matrix5s就会报错(虽然想的是5×5 short);也不是必须是正方形的矩阵。
那如果想用5×5 short的maxtrix呢?或者是长和宽不同的矩阵呢?

Matrix<short, 5, 5> M1;
Matrix<float, 20, 75> M2;

另外,Eigen还支持在编译的时候还不知道长和宽的矩阵,用X代替,如MatrixXf, MatrixXd。

矩阵的初始化

// Initialize A
A << 1.0 f , 0.0 f , 0.0 f ,
	0.0 f , 1.0 f , 0.0 f ,
	0.0 f , 0.0 f , 1.0 f ;
	
// Initialize B by accessing individual elements
for i = 1:4 { 
   
	for j = 1:4 { 
   
		B (j , i ) = 0.0;
	}
}

上面第一种方式,会一行一行地向矩阵中填入数字,所有的数字都必须提供,
如果size不match的话会报错。

第二种方式,B矩阵,可以看到是一列一列填数字的,当然也可以换成一行一行填,不过Eigen的储存方式是列主导的,一列一列填效率会更高。

指定某元素的时候不像C++那样用方括号,A[i. j], 而是圆括号A(i, j)。

也有便利的方式初始化数值

// Set each coefficient to a uniform random value in the range
[ -1 , 1]
A = Matrix3f :: Random () ;

// Set B to the identity matrix
B = Matrix4d :: Identity () ;

// Set all elements to zero
A = Matrix3f :: Zero () ;

// Set all elements to ones
A = Matrix3f :: Ones () ;

// Set all elements to a constant value
B = Matrix4d :: Constant (4.5) ;

矩阵运算

常用的矩阵运算来一波

Matrix4f M1 = Matrix4f :: Random () ;
Matrix4f M2 = Matrix4f :: Constant (2.2) ;

// Addition
// The size and the coefficient - types of the matrices must match
cout << M1 + M2 << endl ;

// Matrix multiplication
// The inner dimensions and the coefficient - types must match
cout << M1 * M2 << endl ;

// Scalar multiplication , and subtraction
// What do you expect the output to be ?
cout << M2 - Matrix4f :: Ones () * 2.2 << endl ;

等号(==)和不等号(!=)也可用在矩阵的比较上,所有对应数字都相等矩阵才相等。

cout << ( M2 - Matrix4f :: Ones () * 2.2 == Matrix4f :: Zero () )
<< endl 

矩阵的转置和逆运算

// Transposition
cout << M1 . transpose () << endl ;

// Inversion ( # include < Eigen / Dense > )
// Generates NaNs if the matrix is not invertible
cout << M1 . inverse () << endl ;

如果想进行矩阵的element-wise计算,可以把矩阵当作array来计算,通过调用array()方法

// Square each element of the matrix
cout << M1 . array () . square () << endl ;

// Multiply two matrices element - wise
cout << M1 . array () * Matrix4f :: Identity () . array () << endl ;

// All relational operators can be applied element - wise
cout << M1 . array () <= M2 . array () << endl << endl ;
cout << M1 . array () > M2 . array () << endl ;

注意上面的方法不是in place的,就是说不是在原矩阵上运算的,它会返回一个新的矩阵,比如
M1.array().sqrt()运算后会返回一个新矩阵,而M1数值不变。

Vector和矩阵用法类似,参考Eigen使用手册

平移和旋转

# include < Eigen / Core >
# include < Eigen / Geometry >
# include < iostream >
using namespace std ;
using namespace Eigen ;
int main () { 
   
	float arrVertices [] = { 
    -1.0 , -1.0 , -1.0 ,
							1.0 , -1.0 , -1.0 ,
							1.0 , 1.0 , -1.0 ,
							-1.0 , 1.0 , -1.0 ,
							-1.0 , -1.0 , 1.0 ,
							1.0 , -1.0 , 1.0 ,
							1.0 , 1.0 , 1.0 ,
							-1.0 , 1.0 , 1.0};
	MatrixXf mVertices = Map < Matrix < float , 3 , 8 > > ( arrVertices ) ;
	Transform < float , 3 , Affine > t = Transform < float , 3 , Affine >::
				Identity () ;
	t . scale ( 0.8 f ) ;
	t . rotate ( AngleAxisf (0.25 f * M_PI , Vector3f :: UnitX () ) ) ;
	t . translate ( Vector3f (1.5 , 10.2 , -5.1) ) ;
	cout << t * mVertices . colwise () . homogeneous () << endl ;
}

上面用C++数组初始化一个MatrixXf型的矩阵,包含了x,y,z坐标。通过Eigen的Map类来初始化矩阵。
t进行了scale, 旋转和平移变换。用矩阵表示的话,变换如下
U = TRSI,其中I表示单位矩阵。

rotation包含了旋转角度和旋转轴,旋转轴必须是归一化的单位向量;可以用AngleAxisf类把旋转角和旋转轴组合到一起。
Vector3f::UnitX(), Vector3f::UnitY, Vector3f::UnitZ() 分别表示x, y, z方向的单位向量。

更多的使用方法请参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183727.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mac idea 2019.1 激活码破解方法

    mac idea 2019.1 激活码破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    97
  • nginx指令详解_考试说明全解

    nginx指令详解_考试说明全解常见的命令有:nginx-sreopen#重启Nginxnginx-sreload#重新加载Nginx配置文件,然后以优雅的方式重启Nginxnginx-sstop#强制停止Nginx服务nginx-squit#优雅地停止Nginx服务(即处理完所有请求后再停止服务)nginx-t#检测配置文件是否有语法错误,然后退出nginx-?,-h#打开帮助信息nginx-v#显示版本信息并退出nginx-V#显示版本和配置选项信息,然后退出

    2025年5月25日
    2
  • SQL学习(一):months_between日期函数

    SQL学习(一):months_between日期函数日期函数months_between的用法:MONTHS_BETWEEN(date1,date2)用于计算date1和date2之间有几个月。如果date1在日历中比date2晚,那么MONTHS_BETWEEN()就返回一个正数。如果date1在日历中比date2早,那么MONTHS_BETWEEN()就返回一个负数。如果date1和date2日期一样,那么MONTHS_BETWEEN()就返回一个0。案例SQL>selectmonths_between(to_date(

    2022年8月20日
    8
  • java教程 电子书_java教程合集(25本)「建议收藏」

    java教程合集25本,pc6帮您一一整理的,这样的入门级java教程应该不会给你带来太大的困惑,起码我没有。相关软件软件大小版本说明下载地址java教程合集(25本),pc6帮您一一整理的,这样的入门级java教程应该不会给你带来太大的困惑,起码我没有。由一个简单的程序谈起――之五(精华).pdf由一个简单的程序谈起――之三(精华).pdf由一个简单的程序谈起――之六(精华).pdf由一个简单的…

    2022年4月18日
    143
  • mysql varchar列转成integer然后获取最大值。[通俗易懂]

    mysql varchar列转成integer然后获取最大值。[通俗易懂]https://blog.csdn.net/c_henjinxing521/article/details/51788963上面的大神写的办法可以。selectMAX(CAST(userNoasSIGNEDINTEGER))fromuserInfo;或者selectMAX(CAST(userNoasUNSIGNEDINTEGER))fromus…

    2025年9月1日
    6
  • mysql中phpmyadmin安装教程_安装phpMyAdmin图文教程[通俗易懂]

    mysql中phpmyadmin安装教程_安装phpMyAdmin图文教程[通俗易懂]phpmyadmin的安装配置已经是老生常谈的话题了,网络上到处都可以找到相关的配置教程。但是,那些大多都是手动配置的,稍不留神,容易出错。因此站长今天在这里介绍的是,被很多phpmyadmin用户所忽略的phpmyadmin自带的安装程序,下面我们就开始一步一步来安装phpmyadmin。1、首先下载phpmyadmin3.4.11,这是目前最稳定无bug的版本,点击下载2、在你的web根目录新…

    2022年6月1日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号