eigen的简单用法汇总
Eigen帮助文档的地址:http://eigen.tuxfamily.org/dox/pages.html
Eigen的论坛:http://forum.kde.org/viewforum.php?f=74
1.一些基本运算
#include <iostream>
using namespace std;
#include <ctime>
//核心部分
#include <Eigen/Core>
//稠密矩阵的运算
#include <Eigen/Dense>
using namespace Eigen;
#define MATRIX_SIZE 50
int main() {
//eigen中的所有向量和矩阵都是Eigen::Matrix,三个参数为数据类型,行,列
//声明一个2*3的float矩阵
Matrix<float,2,3> matrix_23;
Matrix3d m1; //旋转矩阵3*3 双精度,也可改为f
AngleAxisd m2; //旋转向量 3*1
Vector3d m3; //欧拉角 3*1
Quaterniond m4; //四元数 4*1
Isometry3d m5; //欧氏变换矩阵 4*4
Affine3d m6; //仿射变换4*4
Projective3d m7; //射影变换4*4
//Vector3d 本质上还是Eigen::Matrix<double,3,1>即三维向量
Vector3d v_3d;
Matrix<float,3,1> vd_3d; //类似
//本质上是Eigen::Matrix<double,3,3>
Matrix3d matrix_33 = Matrix3d::Zero(); //初始化为0
//不确定矩阵大小,使用动态矩阵
Matrix<double, Dynamic,Dynamic> matrix_dynamic;
//更简单的:
MatrixXd matrix_x;
matrix_23 << 1,2,3,4,5,6;
cout << matrix_23 << endl;
v_3d << 3,2,1;
vd_3d << 4,5,6;
//基本操作
cout << matrix_23.row(2); //取第二行的元素
cout << matrix_23.col(1); //取第一列的元素
matrix_23.dot(matrix_23); //点积,对应元素相乘后相加,结果为一个数
matrix_23.cross(matrix_23); //叉乘,结果为一个矩阵
//乘法,不同类型需要显性的转换
Matrix<double,2,1> result = matrix_23.cast<double>() * v_3d;
cout << "[1,2,3;4,5,6]*[3,2,1]=\n" << result << endl;
/*******矩阵运算*********/
matrix_33 = Matrix3d::Random();
cout << "random matrix33:\n" << matrix_33 << endl;
cout << "transpose:\n" << matrix_33.transpose() << endl; //转置
cout << "sum:" << matrix_33.sum() << endl; //各元素求和
cout << "trace:" << matrix_33.trace() << endl; //迹
cout << "times 10:\n" << matrix_33 * 10 << endl; //数乘
cout << "inverse:\n" << matrix_33.inverse() << endl; //逆
cout << "det:" << matrix_33.determinant() << endl; //行列式
/***********************/
//特征值
//实对称矩阵可以保证对角化成功
SelfAdjointEigenSolver<Matrix3d> eigen_solver(matrix_33.transpose() * matrix_33);
cout << "eigen values = \n" << eigen_solver.eigenvalues() << endl;
cout << "Eigen vectors = \n" << eigen_solver.eigenvectors() << endl;
//解方程
//求解matrix_nn * x = v_Nd这个方程
//直接求逆最直接,但是运算较大
Matrix<double,MATRIX_SIZE,MATRIX_SIZE> matrix_NN
= MatrixXd::Random(MATRIX_SIZE,MATRIX_SIZE);
matrix_NN = matrix_NN * matrix_NN.transpose(); //保证半正定
Matrix<double,MATRIX_SIZE,1> v_Nd = MatrixXd::Random(MATRIX_SIZE,1);
clock_t time_str = clock();
//直接求逆
Matrix<double,MATRIX_SIZE,1> x = matrix_NN.inverse() * v_Nd;
cout << "time is:" << 1000*(clock() - time_str) / (double) CLOCKS_PER_SEC << "ms" << endl;
cout << "x=" << x.transpose() << endl;
//QR分解,速度快很多
time_str = clock();
x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
cout << "time is:" << 1000*(clock() - time_str) / (double) CLOCKS_PER_SEC << "ms" << endl;
cout << "x=" << x.transpose() << endl;
//对于正定矩阵,还可以用cholesky分解来解方程
time_str = clock();
x = matrix_NN.ldlt().solve(v_Nd);
cout << "time is:" << 1000*(clock() - time_str) / (double) CLOCKS_PER_SEC << "ms" << endl;
cout << "x=" << x.transpose() << endl;
//旋转
double theta = n * 2 * M_PI / (poseNums * 4); // 1/4 圆
R = Eigen::AngleAxisd(theta, Eigen::Vector3d::UnitZ());
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project (main)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-O3")
add_definitions(-std=c++11)
include_directories(inc)
aux_source_directory(src DIR_SRCS)
SET(SOUR_FILE ${DIR_SRCS})
include_directories("/usr/include/eigen3")
add_executable(main ${SOUR_FILE})
eigen的简单用法汇总的更多相关文章
- CATransition(os开发之画面切换) 的简单用法
CATransition 的简单用法 //引进CATransition 时要添加包“QuartzCore.framework”,然后引进“#import <QuartzCore/QuartzCo ...
- jquery.validate.js 表单验证简单用法
引入jquery.validate.js插件以及Jquery,在最后加上这个插件的方法名来引用.$('form').validate(); <!DOCTYPE html PUBLIC " ...
- NSCharacterSet 简单用法
NSCharacterSet 简单用法 NSCharacterSet其实是许多字符或者数字或者符号的组合,在网络处理的时候会用到 NSMutableCharacterSet *base = [NSMu ...
- [转]Valgrind简单用法
[转]Valgrind简单用法 http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html Valgrind的主要作者Julian S ...
- Oracle的substr函数简单用法
substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H' *从字符串第一个字符开始截取长度为1的字符串 subst ...
- Ext.Net学习笔记19:Ext.Net FormPanel 简单用法
Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...
- TransactionScope简单用法
记录TransactionScope简单用法,示例如下: void Test() { using (TransactionScope scope = new TransactionScope()) { ...
- WPF之Treeview控件简单用法
TreeView:表示显示在树结构中分层数据具有项目可展开和折叠的控件 TreeView 的内容是可以包含丰富内容的 TreeViewItem 控件,如 Button 和 Image 控件.TreeV ...
- listActivity和ExpandableListActivity的简单用法
http://www.cnblogs.com/limingblogs/archive/2011/10/09/2204866.html 今天自己简单的总结了listActivity和Expandable ...
- SQL*Plus break与compute的简单用法
SQL*Plus break与compute的简单用法在SQL*Plus提示符下输出求和报表,我们可以借助break与compute两个命令来实现.这个两个命令简单易用,可满足日常需求,其实质也相当于 ...
随机推荐
- qt quick工程升级,qmake工程升级至cmake
升级原因 由于音视频工作需要,qt6比qt5的video相关更看重效率. 升级中遇到的问题 在开发的过程中,为了更快速的进行开发,对业务其他不需要代码运行效率的地方使用qml+js的方式进行编写.在升 ...
- vue3响应式原理以及ref和reactive区别还有vue2/3生命周期的对比,第二天
前言: 前天我们学了 ref 和 reactive ,提到了响应式数据和 Proxy ,那我们今天就来了解一下,vue3 的响应式 在了解之前,先复习一下之前 vue2 的响应式原理 vue2 的响应 ...
- MySQL 的 NULL 值是怎么存储的?
大家好,我是小林. 之前有位读者在面字节的时候,被问到这么个问题: 如果你知道 MySQL 一行记录的存储结构,那么这个问题对你没什么难度. 如果你不知道也没关系,这次我跟大家聊聊 MySQL 一行记 ...
- DHorse的链路追踪
目前,DHorse的链路追踪功能是通过SkyWalking来实现.实现原理是DHorse在部署应用时,通过指定SkyWalking的Agent来收集服务的调用链路信息.下面就来具体看一下DHorse如 ...
- 医疗在线OLAP场景下基于Apache Hudi 模式演变的改造与应用
背景 在 Apache Hudi支持完整的Schema演变的方案中(https://mp.weixin.qq.com/s/rSW864o2YEbHw6oQ4Lsq0Q), 读取方面,只完成了SQL o ...
- MySQL 性能压测工具-sysbench,从入门到自定义测试项
sysbench是一个开源的.基于LuaJIT(LuaJIT 是 Lua 的即时编译器,可将代码直接翻译成机器码,性能比原生 lua 要高) 的.可自定义脚本的多线程基准测试工具,也是目前用得最多的 ...
- 7-3 停车场管理 (20point(s))
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出.车辆按到达停车场时间的先后次序依次从停车场最里面向大门口处停放 (即最先到达的第一辆车停放在停车场的最里面) .如果停车场已放满n辆 ...
- hyperf 配置 https 访问
最近用hyperf写了支付系统,本地调试支付完成,打包上线部署,要解决https协议进行相应的访问,但是hyperf 官方没有找到相关的ssl配置说明.搜了一下soole还是有几个案例说明,据我的了解 ...
- 08-通用Service接口
MP也为我们提供了Service层的实现,我们只需要编写一个接口,继承IService, 并创建一个接口实现类继承ServiceImpl,即可使用 基本使用 改造前 定义接口 public inter ...
- DevSecOps 需要知道的十大 K8s 安全风险及建议
Kubernetes (K8s)是现代云原生世界中的容器管理平台.它实现了灵活.可扩展地开发.部署和管理微服务.K8s 能够与各种云提供商.容器运行时接口.身份验证提供商和可扩展集成点一起工作.然而 ...