记录下Eigen的学习,参考SLAM十四讲。Eigen库是一个线性运算的C++模板库,支持线性代数、矩阵、矢量运算。
常用的头文件:
#include <Eigen/Dense>
#include <Eigen/Geometry>
#include <Eigen/Core>
using namespace Eigen;
using namespace std;
定义:Eigen::Matrix<float,rows,cols> 第一个参数类型:float(单精度)、double(双精度);后两个参数类型:矩阵的行列。
直接使用重载运算符<<输入输出;for遍历输入输出
Eigen::Matrix<float,2,3> matrix_23; //定义2X3矩阵,float型
matrix_23<<1,2,3,4,5,6; //输入
for(int i=0;i<matrix_23.rows();i++) //遍历输出
{
for(int j=0;j<matrix_23.cols();j++)
{
cout<<matrix_23(i,j)<<"\t";
}
cout<<endl;
}
Eigen::Matrix3d matrix_33; //3X3方阵,double
for(int i=0;i<3;i++) //矩阵输入
{
for(int j=0;j<3;j++)
{
matrix_33(i,j) = 1;
}
}
cout<<matrix_33<<endl;
Eigen::vector3d vec_3d; //向量 3行1列
vec_3d<<1,2,3;
cout<<vec_3d<<endl;
Eigen::Matrix<double,3,1> vec_3d_2; //同样表示3行1列---矩阵
vec_3d_2 = vec_3d;
cout<<vec_3d_2<<endl;
Eigen::Matrix<double,Dynamic,Dynamic> matrix_dynamic //动态矩阵
Eigen::MatrixXd::Zero(3,3); //3x3零矩阵
Eigen::MatrixXd::Ones(5,5); //5x5全1矩阵
Eigen::MatrixXd::Identity(2,2); //2x2单位矩阵
Eigen::MatrixXd::Random(3,3); //3x3随机矩阵
Matrix3d matrix_33;
matrix_33 << 1,2,3,4,5,6,7,8,9;
cout<<matrix_33.sum()<<endl; //矩阵元素之和
cout<<matrix_33.prod()<<endl; //矩阵元素之积
cout<<matrix_33.mean()<<endl; //平均值
cout<<matrix_33.norm()<<endl; //2范数--元素平方和的1/2次方
cout<<matrix_33.minCoeff()<<endl; //返回矩阵最小元素
cout<<matrix_33.maxCoeff()<<endl; //返回矩阵最大元素
//matrix_33.minCoeff(&i,&j) //返回最小元素的位置
cout<<matrix_33.trace()<<endl; //矩阵的迹---对角线元素和
cout<<matrix_33.transpose()<<endl; //矩阵转置,原矩阵不变
//cout<<matrix_33.transposeInplace(); //转置并改变赋值给原矩阵
cout<<matrix_33.determinant()<<endl; //行列式
cout<<matrix_33.conjugate()<<endl; //共轭矩阵---实部不变,虚部取反
cout<<matrix_33.inverse()<<endl; //矩阵的逆---行列式0,没有逆
cout<<matrix_33.adjoint(); //共轭转置
Matrix<float,2,3> matrix_23;
cout<<"矩阵的行数"<<matrix_23.rows()<<endl;
cout<<"矩阵的列数"<<matrix_23.cols()<<endl;
matrix_23 << 1,2,3,4,5,6;
cout<<"矩阵第二行的元素:"<<matrix_23.row(1)<<endl; //按行输出
cout<<"矩阵第二列的元素:"<<endl;
cout<<matrix_23.col(1)<<endl; //按列输出
cout<<matrix_23.block<2,2>(0,1)<<endl; //从矩阵0行1列位置处取2X2矩阵
Vector3d vec_3d;
Matrix<float,3,1> vf_3d;
Matrix<float,2,3> matrix_23;
vec_3d<<3,2,1;
vf_3d<<4,5,6;
matrix_23<<1,2,3,4,5,6;
Matrix<double,2,1> matrix_21 = matrix_23.cast<double>()* vec_3d;
cout<<matrix_21<<endl;
Vector3d v(1,2,3);
Vector3d w(4,5,6);
cout<<"向量点积:";
cout<<v.dot(w)<<endl;
cout<<"向量叉积:";
cout<<v.cross(w)<<endl;
cout<<"向量的模:";
cout<<v.norm()<<endl;
Matrix3d matrix_33;
matrix_33 = Matrix3d::Random();
cout<<matrix_33<<endl;
//自伴随特征求解
SelfAdjointEigenSolver<Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);
//特征求解
EigenSolver<Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);
cout<<"特征值:"<<endl;
cout<<eigen_solver.eigenvalues()<<endl;
cout<<"特征向量:"<<endl;
cout<<eigen_solver.eigenvectors()<<endl;
/*
matrix_NN * x = v_Nd
*/
#define MATRIX_SIZE 50
Matrix<double,MATRIX_SIZE ,MATRIX_SIZE > matrix_NN = MatrixXd::Random(MATRIX_SIZE ,MATRIX_SIZE );
//设置半正定矩阵
matrix_NN = matrix_NN * matrix_NN.transpose();
//v_Nd矩阵
Matrix<double,MATRIX_SIZE ,1> v_Nd = MatrixXd::Random(MATRIX_SIZE ,1);
//可逆矩阵求解方程
Matrix<double,MATRIX_SIZE ,1> x1 = matrix_NN.inverse() * v_Nd;
cout<<x1<<endl;
cout<<"------------------------分割线1------------------------"<<endl;
//QR分解求解,可以求解非方阵
Matrix<double,MATRIX_SIZE ,1> x2 = matrix_NN.colPivHouseholderQr().solve(v_Nd);
cout<<x2<<endl;
cout<<"------------------------分割线2------------------------"<<endl;
//cholesky分解求解
Matrix<double,MATRIX_SIZE ,1> x3 = matrix_NN.ldlt().solve(v_Nd);
cout<<x3<<endl;
Eigen::AngleAxisd t_v(M_PI/4,Vector3d(0,0.1)); //旋转向量,绕(0,0,1)z轴旋转M_PI/4
Matrix3d t_r = t_v.matrix(); //旋转矩阵,将旋转向量转为旋转矩阵
Quaterniond t_q(t_v); //四元数
//对旋转向量赋值
AngleAxisd V1(M_PI/4,Vector3d(0,0,1)); //使用旋转角度和旋转轴(单位向量)来初始化
cout<<"Rotation vector 1:";
cout<<V1.matrix()<<endl;
AngleAxisd V2;
V2.fromRotationMatrix(t_r); //使用fromRotationMatrix()函数对旋转向量赋值(四元数没有该方法)
cout<<"Rotation vector 2:";
cout<<V2.matrix()<<endl;
AngleAxisd V3;
V3 = t_r; //直接用旋转矩阵对旋转向量赋值
cout<<"Rotation vector 3:";
cout<<V3.matrix()<<endl;
AngleAxisd V4(t_r); // 使用旋转矩阵对旋转向量初始化
cout<<"Rotation vector 4:";
cout<<V4.matrix()<<endl;
AngleAxisd V5;
V5 = t_q; //使用四元数对旋转向量赋值
cout<<"Rotation vector 5:";
cout<<V5.matrix()<<endl;
AngleAxisd V6(t_q); //使用四元数对旋转向量初始化
cout<<"Rotation vector 6:";
cout<<V6.matrix()<<endl;
cout<<"-----------------------------------------------------------------"<<endl;
//对旋转矩阵赋值
Matrix3d R1 = Matrix3d::Identity(); //旋转矩阵函数初始化旋转矩阵
Matrix3d R2;
R2 = t_v.matrix(); //使用旋转向量的成员函数matrix()对旋转矩阵赋值
Matrix3d R3;
R3 = t_v.toRotationMatrix(); //使用旋转向量的成员函数toRotationMatrix()对旋转矩阵赋值
Matrix3d R4;
R4 = t_q.matrix(); //使用四元数的成员函数matrix()对旋转矩阵赋值
Matrix3d R5;
R5 = t_q.toRotationMatrix(); //使用四元数的成员函数toRotationMatrix()对旋转矩阵赋值
cout<<"-----------------------------------------------------------------"<<endl;
//对四元数赋值 Eigen中的四元数前三维是虚部,最后一维是实部
//使用旋转角度和旋转轴向量初始化四元数 q=[cos(A/2),n_x*sin(A/2),n_y*sin(A/2),n_z*sin(A/2)]
Quaterniond Q1(cos((M_PI/4)/2), 0*sin((M_PI/4)/2),0*sin((M_PI/4)/2),1*sin((M_PI/4)/2));
cout<<"Quaterniond Q1:"<<endl;
cout<<Q1.coeffs()<<endl;
Quaterniond Q2;
Q2 = t_r; //旋转矩阵对四元数直接赋值
cout<<"Quaterniond Q2:"<<endl;
cout<<Q2.coeffs()<<endl;
Quaterniond Q3(t_r); //旋转矩阵对四元数赋值
cout<<"Quaterniond Q3:"<<endl;
cout<<Q3.coeffs()<<endl;
Quaterniond Q4;
Q4 = t_v; //旋转向量对四元数初始化
cout<<"Quaterniond Q4:"<<endl;
cout<<Q4.coeffs()<<endl;
Quaterniond Q5(t_v); //旋转向量对四元数初始化
cout<<"Quaterniond Q5:"<<endl;
cout<<Q5.coeffs()<<endl;
//旋转矩阵转欧拉角
Matrix3d rotation_matrix = Matrix3d::Identity();
Vector3d enler_angles = rotation_matrix.enlerAngles(2,1,0); //0:x轴,1:y轴,2:z轴(2,1,0)代表输出角度顺序
cout<<"yaw,pitch,roll:"<<enler_angles.transpose()<<endl;
//旋转矩阵和平移向量定义变换矩阵Isometry3d
Matrix3d rotation_m = Matrix3d::Identity();
Vector3d t1;
t1<<3.214096e-14,-1.998401e-15,-4.041212e-14;
Eigen::Isometry3d T1 = Eigen::Isometry3d::Identity(); //初始化
T1.rotate(rotation_m ); //导入旋转矩阵
T1.pretranslate(t1); //导入平移向量
cout<<T1.matrix()<<endl;
//四元数和平移向量定义变换矩阵
Quaterniond q1(0.35,0.2,0.3,0.1);
q1.normalize(); //归一化
Vector3d t2(0.3, 0.3, 0.3);
Eigen::Isometry3d T2(q1);
T2.pretranslate(t2);
cout<<T2.matrix()<<endl;
//通过Eigen::Matrix4d构造变换矩阵
Matrix3d rotation_m2 = Matrix3d::identity(); //初始化
Eigen::Matrix4d T3;
T3.setIdentity();
T3.block<3,3>(0,0) = rotation_m2;
T3.topRightCorner(3,1) = t2;
cout<<T3.matrix()<<endl;
本文简要的介绍了Eigen的学习使用,对于常见的函数给出了使用方法,其它的函数用到去查官方文档即可。
'_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>'使用如下转换就可以了new Map<String, dynamic>.from(params)__internallinkhashmap
目录一、带宽的概念1. B和b的关系2. 带宽的概念3. 相关换算公式二、码率的概念 & 码率和带宽的区别三、分辨率的概念1、分辨率的含义2、分辨率高的好处:3、图片在不同分辨率手机的效果:四、帧率的概念1. 什么是帧率 2、IPB帧 3、GOP(Group Of Picture)..._分辨率和带宽的换算
1 Number 数字类型 :包含正数,负数,小数 十进制表示:var n1 =23; 十六进制表示法:从0-9,a(A)-f(F)表示数字。以0x开头。 var n2 = 0x422 字符串数据类型 String:凡是用双引号或者单引号引起的都是字符串。var n3 ="双引号引入内容";var n4 ="单引号引入内容";3 布尔数据类型 Boolean:只有2个值一个是true, 一个是...
首先是后端,用户访问首页的时候通常不会有csrf问题,在这里添加cookiefrom django.middleware.csrf import get_tokencsrf_token = get_token(request)response= render(request, "index.html")response.set_cookie('csrf_token', csrf_token)return response这样csrf就随着cookie一起过去了然后是axios的设置添加请
rem是相对于根元素,这代表我们只需要在根元素设定一个参考值即可。一般我们设定:html{font-size:62.5%;}body{font-size:1.4rem;}如果没有设置,默认是100%即16px。_css如何设计最小字体
上午看了一篇张鑫旭的博客,深入讲解了一下 vertival-align 和 line-height 的关系,感觉打开了新世界的大门。目前我的目标还只是一个熟练的页面仔,下一步就是要熟悉CSS的原理机制。博客里面的内容很多但是没有细讲,先Mark下来,后面慢慢消化 。这是传送门:http://www.zhangxinxu.com/wordpress/2015/08/css-deep-un
JSF应用中,在web.xml里面配置了一个Servlet,叫做javax.faces.webapp.FacesServlet,于是可以知道,查看、了解一个请求的处理过程可以从这里开始。从官方网站上下载JSF的源代码,项目名比较古怪,叫做“mojarra”,我看的版本是1.2_12_b01。里面包含了两个子项目,一个是jsf-api,里面大多是接口以及少量关键类。另外一个项目叫做jsf-ri,对着_jsf请求
安装ones_erp系统,安装提示need mysql version >= 5.6.5mysql -version显示:mysql Ver 15.1 Distrib 10.1.13-MariaDB, for Win32 (AMD64)原本以为提示有错,我的mysql版本明显大于5.6.5,但后来了解到这个版本和上面提示中的版本不是一个概念,提示中的版本应该是控制台登录时候提示出来的,
dfs#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int N=9;int ones[1<<N],map[1<<N];int row[N],col[N],cell[3][3];char str[100]; in..._sudoku poj - 3074
PDCA执行法就是把事情的执行过程分成四个环节:计划(Plan)、执行(Do)、检查(Check)和行动(Act),从而把控执行过程,保证具体事项高效高质地落地。PDCA循环的四个过程不是运行一次就完结,而是周而复始地进行。一个循环结束了,解决了一部分问题,可能还有问题没有解决,或者又出现了新的问题,再进行下一个PDCA循环,依此类推。1.计划环节确定具体任务、阶段目标、时间节点和具体责任人第1步:明确问题问题可以用三种方式之一来定义。第一种是,任何与标准有偏差的东西。第二种是实际状况与期望状况之
数据挖掘十大经典算法之K-means引言:k-means与kNN虽然都是以k打头,但却是两类算法——kNN为监督学习中的分类算法,而k-means则是非监督学习中的聚类算法;二者相同之处:均利用近邻信息来标注类别。聚类是数据挖掘中一种非常重要的学习流派,指将未标注的样本数据中相似的分为同一类,正所谓“物以类聚,人以群分”嘛。k-means是聚类算法中最为简单、高效的,核心思想:由用户指定k个初..._sse=∑1_l^k ∑1_(x∈c_i) 〖dist(c_i,x)^2〗
轻量型的ONU查询工具,智能查询板卡,查询自动发现,搜索ONU等功能,需要更多智能功能,可联系QQ:561454825下载地址:下载地址1转载于:https://www.cnblogs.com/lome/p/6509456.html...