有关eigen库的一些基本使用方法
目录
- 介绍
- 安装
- Demo
- 矩阵、向量初始化
- C++数组和矩阵转换
- 矩阵基础操作
- 点积和叉积
- 转置、伴随、行列式、逆矩阵
- 计算特征值和特征向量
- 解线性方程
- 最小二乘求解
- 稀疏矩阵
介绍
Eigen是一个轻量级的矩阵库,除了稀疏矩阵不成熟(3.1有较大改进)以外,其他的矩阵和向量操作都比较完善,而且速度不错.
不支持vc6.0,vs最低版本支持2003(打补丁),最好是2005以上.
安装
在eigen 3.1.3下载最新的版本,然后解压文件,将解压出来的文件夹下的\\Eigen\文件夹拷贝到程序文件夹下,包括头文件,即可使用
Demo
eigendemo.zip
示例是vs2010环境下的程序,主要的文件就只有main.cpp和Eigen文件夹。
矩阵、向量初始化
#include <iostream> #include "Eigen/Dense" using namespace Eigen; int main() {MatrixXf m1(3,4); //动态矩阵,建立3行4列。MatrixXf m2(4,3); //4行3列,依此类推。MatrixXf m3(3,3);Vector3f v1; //若是静态数组,则不用指定行或者列/* 初始化 */Matrix3d m = Matrix3d::Random();m1 = MatrixXf::Zero(3,4); //用0矩阵初始化,要指定行列数m2 = MatrixXf::Zero(4,3);m3 = MatrixXf::Identity(3,3); //用单位矩阵初始化v1 = Vector3f::Zero(); //同理,若是静态的,不用指定行列数m1 << 1,0,0,1, //也可以以这种方式初始化1,5,0,1,0,0,9,1;m2 << 1,0,0,0,4,0,0,0,7,1,1,1;//向量初始化,与矩阵类似Vector3d v3(1,2,3);VectorXf vx(30); }
C++数组和矩阵转换
使用Map函数,可以实现Eigen的矩阵和c++中的数组直接转换,语法如下:
//@param MatrixType 矩阵类型 //@param MapOptions 可选参数,指的是指针是否对齐,Aligned, or Unaligned. The default is Unaligned. //@param StrideType 可选参数,步长 /*Map<typename MatrixType,int MapOptions,typename StrideType> */int i;//数组转矩阵double *aMat = new double[20];for(i =0;i<20;i++){aMat[i] = rand()%11;}//静态矩阵,编译时确定维数 Matrix<double,4,5> Eigen:Map<Matrix<double,4,5> > staMat(aMat);//输出for (int i = 0; i < staMat.size(); i++)std::cout << *(staMat.data() + i) << " ";std::cout << std::endl << std::endl;//动态矩阵,运行时确定 MatrixXdMap<MatrixXd> dymMat(aMat,4,5);//输出,应该和上面一致for (int i = 0; i < dymMat.size(); i++)std::cout << *(dymMat.data() + i) << " ";std::cout << std::endl << std::endl;//Matrix为列优先,如下返回指针dymMat.data();
矩阵基础操作
eigen重载了基础的+ - * / += -= *= /= *可以表示标量和矩阵或者矩阵和矩阵
#include <iostream> #include <Eigen/Dense> using namespace Eigen; int main() {//单个取值,单个赋值double value00 = staMat(0,0);double value10 = staMat(1,0);staMat(0,0) = 100;std::cout << value00 <<value10<<std::endl;std::cout <<staMat<<std::endl<<std::endl;//加减乘除示例 Matrix2d 等同于 Matrix<double,2,2>Matrix2d a;a << 1, 2,3, 4;MatrixXd b(2,2);b << 2, 3,1, 4;Matrix2d c = a + b;std::cout<< c<<std::endl<<std::endl;c = a - b;std::cout<<c<<std::endl<<std::endl;c = a * 2;std::cout<<c<<std::endl<<std::endl;c = 2.5 * a;std::cout<<c<<std::endl<<std::endl;c = a / 2;std::cout<<c<<std::endl<<std::endl;c = a * b;std::cout<<c<<std::endl<<std::endl;
点积和叉积
#include <iostream> #include <Eigen/Dense> using namespace Eigen; using namespace std; int main() {//点积、叉积(针对向量的)Vector3d v(1,2,3);Vector3d w(0,1,2);std::cout<<v.dot(w)<<std::endl<<std::endl;std::cout<<w.cross(v)<<std::endl<<std::endl; } */
转置、伴随、行列式、逆矩阵
小矩阵(4 * 4及以下)eigen会自动优化,默认采用LU分解,效率不高
#include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int main() {Matrix2d c;c << 1, 2,3, 4;//转置、伴随std::cout<<c<<std::endl<<std::endl;std::cout<<"转置\n"<<c.transpose()<<std::endl<<std::endl;std::cout<<"伴随\n"<<c.adjoint()<<std::endl<<std::endl;//逆矩阵、行列式std::cout << "行列式: " << c.determinant() << std::endl;std::cout << "逆矩阵\n" << c.inverse() << std::endl; }
计算特征值和特征向量
#include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int main() {//特征向量、特征值std::cout << "Here is the matrix A:\n" << a << std::endl;SelfAdjointEigenSolver<Matrix2d> eigensolver(a);if (eigensolver.info() != Success) abort();std::cout << "特征值:\n" << eigensolver.eigenvalues() << std::endl;std::cout << "Here's a matrix whose columns are eigenvectors of A \n"<< "corresponding to these eigenvalues:\n"<< eigensolver.eigenvectors() << std::endl; }
解线性方程
#include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int main() {//线性方程求解 Ax =B;Matrix4d A;A << 2,-1,-1,1,1,1,-2,1,4,-6,2,-2,3,6,-9,7;Vector4d B(2,4,4,9);Vector4d x = A.colPivHouseholderQr().solve(B);Vector4d x2 = A.llt().solve(B);Vector4d x3 = A.ldlt().solve(B); std::cout << "The solution is:\n" << x <<"\n\n"<<x2<<"\n\n"<<x3 <<std::endl; }
除了colPivHouseholderQr、LLT、LDLT,还有以下的函数可以求解线性方程组,请注意精度和速度: 解小矩阵(4*4)基本没有速度差别
Decomposition | Method | 矩阵特殊要求 | 速度 | 精度 |
PartialPivLU | partialPivLu() | 可逆 | ++ | + |
FullPivLU | fullPivLu() | None | - | +++ |
HouseholderQR | householderQr() | None | ++ | + |
ColPivHouseholderQR | colPivHouseholderQr() | None | + | ++ |
FullPivHouseholderQR | fullPivHouseholderQr() | None | - | +++ |
LLT | llt() | 正定 | +++ | + |
LDLT | ldlt() | 正或负半定 Positive or negative semidefinite | +++ | ++ |
最小二乘求解
最小二乘求解有两种方式,jacobiSvd或者colPivHouseholderQr,4*4以下的小矩阵速度没有区别,jacobiSvd可能更快,大矩阵最好用colPivHouseholderQr
#include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int main() {MatrixXf A1 = MatrixXf::Random(3, 2);std::cout << "Here is the matrix A:\n" << A1 << std::endl;VectorXf b1 = VectorXf::Random(3);std::cout << "Here is the right hand side b:\n" << b1 << std::endl;//jacobiSvd 方式:Slow (but fast for small matrices)std::cout << "The least-squares solution is:\n"<< A1.jacobiSvd(ComputeThinU | ComputeThinV).solve(b1) << std::endl;//colPivHouseholderQr方法:faststd::cout << "The least-squares solution is:\n"<< A1.colPivHouseholderQr().solve(b1) << std::endl; }
稀疏矩阵
稀疏矩阵的头文件包括:
#include <Eigen/SparseCore>#include <Eigen/SparseCholesky>#include <Eigen/IterativeLinearSolvers>#include <Eigen/Sparse>
初始化有两种方式: 1.使用三元组插入
typedef Eigen::Triplet<double> T; std::vector<T> tripletList; triplets.reserve(estimation_of_entries); //estimation_of_entries是预估的条目 for(...) {tripletList.push_back(T(i,j,v_ij));//第 i,j个有值的位置的值 } SparseMatrixType mat(rows,cols); mat.setFromTriplets(tripletList.begin(), tripletList.end()); // mat is ready to go!
2.直接将已知的非0值插入
SparseMatrix<double> mat(rows,cols); mat.reserve(VectorXi::Constant(cols,6)); for(...) {// i,j 个非零值 v_ij != 0mat.insert(i,j) = v_ij; } mat.makeCompressed(); // optional
稀疏矩阵支持大部分一元和二元运算:
sm1.real() sm1.imag() -sm1 0.5*sm1 sm1+sm2 sm1-sm2 sm1.cwiseProduct(sm2)
二元运算中,稀疏矩阵和普通矩阵可以混合使用
//dm表示普通矩阵 dm2 = sm1 + dm1;
也支持计算转置矩阵和伴随矩阵
有关eigen库的一些基本使用方法相关推荐
- Eigen库最小二乘拟合
Eigen库最小二乘拟合 最小二乘公式 Eigen实现 其他 在研究zernike多项式过程中,需要使用到矩阵的最小二乘拟合.所以在这里记录分享Eigen库的最小二乘拟合使用方法. by HPC_ZY ...
- Eigen库QR分解
Eigen库QR分解 基本 实战 其他 在计算光斑中心位置的研究中,选择了高斯中心法,而该方法求解过程中需要用到QR分解.所以在这里记录分享Eigen库的QR分解使用方法. by HPC_ZY 基本 ...
- Linux下添加eigen头文件,移植Eigen库到SylixOS下及使用方法
1. 开发环境 宿主机:Windows 7 集成开发环境:Real-Evo IDE 3.5.3 虚拟机:Ubuntu 目标机:x86 2. Eigen简介 Eigen是一个提供了线性代数.矩阵.向量操 ...
- ROS中使用Eigen库[不定期更新]
前期说明 ROS中的数据操作需要线性代数,Eigen库是C++中的线性代数计算库. Eigen库独立于ROS,但是在ROS中可以使用. Eigen库可以参见http://eigen.tuxfamily ...
- Eigen库对齐问题:declspec(align('16')) 的形参将不被对齐
一:错误提示:error C2719: '_Val': formal parameter with __declspec(align('16')) won't be aligned 英文提示:erro ...
- 查看eigen库版本的指令
在调试代码过程中,发现有个关于eigen库文件调取不到的报错,想查看eigen库有没有安装及版本号是多少,试了几个方法,这个指令可行,如下: gedit /usr/include/eigen3/Eig ...
- 关于C++中Eigen库效率提升的思考
目录 引言 一.什么是Eigen? 二.使用步骤 1.引入库 2.建立矩阵 3.基本操作 三.具体的例子--矩阵乘法 1.Eigen库 2.GPU并行计算 总结 可能的方案 引言 在处理矩阵运算上,各 ...
- 使用eigen库进行空间变换
使用eigen库进行空间变换 在三维空间中,常常需要变换当前机器人的位姿计算定义的绝对坐标系和当前机器人所处相对坐标系之间的关系.而主要的变换则是平移和旋转,有时候可能需要尺度变换,那么就可以描述为: ...
- C++随机数产生以及通过Eigen库获得正态分布的随机矩阵
简介 在C++11标准之前,一般是利用rand()函数产生一个均匀分布的,范围从0到系统相关的最大值之间的随机整数,然后再通过转换得到不同分布的随机数,这种方法比较麻烦,同时转换过程中会引入非随机性. ...
最新文章
- 如何将frm文件导入MySql数据库
- 计算机包括桌面计算机和便携式计算机,()计算机包括桌面计算机和便携式计算机这两种形式...
- 非法ip通过ssh成功登录,自动结束会话
- Spring 异步调用,一行代码实现!舒服,不接受任何反驳~
- 利用文件摘要简化游戏资源的引用管理
- 【LightOJ - 1030】Discovering Gold(概率dp,数学期望,期望的线性性)
- Java、SQL 十年混战史:Oracle 告 Google、“窃”IBM 往事
- Hyperledger Fabric ./byfn.sh -m up -s couchdb Error peer0.org1 failed to join the channel
- 编程开源_5种最适合编程的开源字体
- PDF Candy Desktop(全能PDF工具箱)官方中文版V2.91 | pdf candy desktop官网下载 | 含pdf candy desktop使用教程
- StyleBook皮肤控件的使用
- 政府推荐:房屋租赁合同电子版模板出租房个人住房商业租房Word协议书范本
- html b5纸尺寸,A5纸的尺寸多大(各种标准纸张大小A1,A2,A3,A4纸的尺寸)
- 打开共享文件提示服务器空间不足,访问网络共享报告“服务器存储空间不足,无法处理此命令”...
- Ti ub954/953 Sensor调试心得
- 论文复审意见及实验规划
- 浏览器无法打开网页-重置网络命令
- win10如何新增ip地址
- c语言解密pdf,C语言设计-英文加密解密系统资料.pdf
- 姜昆、李文华相声《如此照相》,警醒
热门文章
- Kubernetus自传
- mysql事务概念_MySQL事务的概念
- 计算机网络研讨_[即将举行的网络研讨会]对Kubernetes进行故障排除:您需要具备的7个关键组件...
- stm32f4 hs 电路_三相电路分析
- mllib逻辑回归 spark_Spark架构详解——分布式流计算内存批处理迭代运算框架
- java数组随机排序_JAVA 生成随机数数组,并排序输出
- 最近又Get个新技能,不是全栈也能用技术倒腾点东西赚零花钱了!
- 面试:说说参数验证 @Validated 和 @Valid 的区别?
- 三款云数据库性能测试,谁表现最好?
- 追踪JVM中的本地内存