在用C++写MPC控制算法的时候,由于MPC算法包括矩阵运算,c++对矩阵的运算支持不是很好,而Eigen(读作 ['aɪgən])是一个简单易用的用于矩阵运算的库。
1.安装
首先在官网下载Eigen库,下载地址
解压缩文件可以得到以下的文件
我们主要使用的是其中的Eigen文件夹,这其中就是主要的文件。
由于Eigen都是由头文件组成的,所以包含相应的库路径即可。
在VS2017运行环境下
首先包含相应的库路径
在项目上右键,找到属性,添加相应的库路径即可,注意我这里包含到路径到Eigen这个文件夹,所以在包含头文件时,#include<Dense>即可,不需要写#include<Eigen/Dense>
在ROS系统里面,在你的项目的CMakeLists中包含相应的库路径即可。
2.简单使用
在添加了相应的路径之后,在程序开头写这几行即可使用了
#include <iostream>
#include <Dense>
using Eigen::MatrixXd;
using namespace std;
声明一个矩阵:
MatrixXd P(3, 6);
MatrixXd s(3, 1);
MatrixXd v(6, 1);
第一行表示生成一个3行6列的矩阵
向矩阵输入数据,顺序输入即可
v << -3, -2, -1, 3, 2, 1;
输入常见矩阵
MatrixXf m1(3,4); //动态矩阵,建立3行4列。
MatrixXf m2(4,3); //4行3列,依此类推。
MatrixXf m3(3,3);
Vector3f v1; //若是静态数组,则不用指定行或者列
/* 初始化 */
m1 = MatrixXf::Zero(3,4); //用0矩阵初始化,要指定行列数
m2 = MatrixXf::Zero(4,3);
m3 = MatrixXf::Identity(3,3); //用单位矩阵初始化
v1 = Vector3f::Zero(); //同理,若是静态的,不用指定行列数
矩阵的一些操作
m.transpose();//矩阵转置
m.inverse();//矩阵求逆
m.determinant();//求行列式
一个个人要用的操作,矩阵分块
//如果定义一个尾数较高的矩阵,由10*10个三行二列矩阵构成
MartixXd A(3*10,2*10);
MartixXd a(3,2);
//如果相对A矩阵块的某一个子矩阵赋值
A.block(2*3,4*2,3,2) = a;//第一个第二个参数是子矩阵的开头位置,后面两个表示子矩阵的大小
//这样就将第二行第四个子矩阵赋值