Eigen库使用

前言

Eigen是一个高层次的C ++库,有效支持 得到的线性代数,矩阵和矢量运算,数值分析及其相关的算法。

配置

关于Eigen库的配置只需要在属性表包含目录中添加Eigen路径即可。
这里写图片描述

例子

Example 1:

#include <iostream>
#include <Eigen/Dense>

void main()
{
    Eigen::MatrixXd m(2, 2);            //声明一个MatrixXd类型的变量,它是2*2的矩阵,未初始化
    m(0, 0) = 3;                        //将矩阵第1个元素初始化3
    m(1, 0) = 2.5;                      //将矩阵第3个元素初始化3
    m(0, 1) = -1;  
    m(1, 1) = m(1, 0) + m(0, 1);  
    std::cout << m << std::endl;
}

Eigen头文件定义了很多类型,但对于简单的应用程序,可能只使用MatrixXd类型。 这表示任意大小的矩阵(MatrixXd中的X),其中每个条目是双精度(MatrixXd中的d)。 Eigen / Dense头文件定义了MatrixXd类型和相关类型的所有成员函数。 在这个头文件中定义的所有类和函数都在特征名称空间中。

这里写图片描述

Example 2:

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{  
    MatrixXd m = MatrixXd::Random(3,3);                 //使用Random随机初始化3*3的矩阵
    m = (m + MatrixXd::Constant(3,3,1.2)) * 50;  
    cout << "m =" << endl << m << endl;  
    VectorXd v(3);                                      //这表示任意大小的(列)向量。
    v << 1, 2, 3;  
    cout << "m * v =" << endl << m * v << endl;
}
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{  
    Matrix3d m = Matrix3d::Random();                    //使用Random随机初始化固定大小的3*3的矩阵
    m = (m + Matrix3d::Constant(1.2)) * 50;  
    cout << "m =" << endl << m << endl;  Vector3d v(1,2,3);    
    cout << "m * v =" << endl << m * v << endl;
}

Matrix&Vector

Example 3:

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{  
    MatrixXd m(2,2);  
    m(0,0) = 3;  
    m(1,0) = 2.5;  
    m(0,1) = -1;  
    m(1,1) = m(1,0) + m(0,1);  
    std::cout << "Here is the matrix m:\n" << m << std::endl;  
    VectorXd v(2);  
    v(0) = 4;  
    v(1) = v(0) - 1;  
    std::cout << "Here is the vector v:\n" << v << std::endl;
}

逗号初始化

Example 4:

Matrix3f m;
m << 1, 2, 3,     4, 5, 6,     7, 8, 9;
std::cout << m;

通过Resize调整矩阵大小

矩阵的当前大小可以通过rows(),cols()和size()检索。 这些方法分别返回行数,列数和系数数。 通过resize()方法调整动态大小矩阵的大小。
Example 5:

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{  
    MatrixXd m(2,5);                //初始化大小2*5
    m.resize(4,3);                  //重新调整为4*3
    std::cout << "The matrix m is of size "            << m.rows() << "x" << m.cols() << std::endl;  
    std::cout << "It has " << m.size() << " coefficients" << std::endl;  
    VectorXd v(2);  v.resize(5);  
    std::cout << "The vector v is of size " << v.size() << std::endl;
    std::cout << "As a matrix, v is of size "            << v.rows() << "x" << v.cols() << std::endl;
}

通过赋值调整矩阵大小

Example 6:

MatrixXf a(2, 2); 
std::cout << "a is of size " << a.rows() << "x" << a.cols() << std::endl; 
MatrixXf b(3, 3); 
a = b; 
std::cout << "a is now of size " << a.rows() << "x" << a.cols() << std::endl;

Eigen + - * 等运算

Eigen通过通用的C ++算术运算符(例如+, - ,)或通过特殊方法(如dot(),cross()等)的重载提供矩阵/向量算术运算。对于Matrix类(矩阵和向量) 只被重载以支持线性代数运算。 例如,matrix1 matrix2表示矩阵矩阵乘积。
Example 7:

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{  
    Matrix2d a;  a << 1, 2,       3, 4;  
    MatrixXd b(2,2); 
    b << 2, 3,       1, 4; 
    std::cout << "a + b =\n" << a + b << std::endl;
    std::cout << "a - b =\n" << a - b << std::endl; 
    std::cout << "Doing a += b;" << std::endl; 
    a += b;  
    std::cout << "Now a =\n" << a << std::endl; 
    Vector3d v(1,2,3);  
    Vector3d w(1,0,0);  
    std::cout << "-v + w - v =\n" << -v + w - v << std::endl;
}

Example 8:

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{  
    Matrix2d a;  
    a << 1, 2,       3, 4;  
    Vector3d v(1,2,3);  
    std::cout << "a * 2.5 =\n" << a * 2.5 << std::endl; 
    std::cout << "0.1 * v =\n" << 0.1 * v << std::endl; 
    std::cout << "Doing v *= 2;" << std::endl;  v *= 2; 
    std::cout << "Now v =\n" << v << std::endl;
}

矩阵转置、共轭和伴随矩阵

MatrixXcf a = MatrixXcf::Random(2,2);
cout << "Here is the matrix a\n" << a << endl;
cout << "Here is the matrix a^T\n" << a.transpose() << endl;
cout << "Here is the conjugate of a\n" << a.conjugate() << endl;
cout << "Here is the matrix a^*\n" << a.adjoint() << endl;

禁止如下操作:

a = a.transpose(); // !!! do NOT do this !!!

但是可以使用如下函数:

a.transposeInPlace();

此时a被其转置替换。

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{
    Matrix2i a;
    a << 1, 2, 3, 4;
    std::cout << "Here is the matrix a:\n" << a << std::endl;
    a = a.transpose(); // !!! do NOT do this !!!
    std::cout << "and the result of the aliasing effect:\n" << a << std::endl;
}

矩阵* 矩阵和矩阵* 向量操作

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
int main()
{  
    Matrix2d mat;  mat << 1, 2,         3, 4;  
    Vector2d u(-1,1), v(2,0);  
    std::cout << "Here is mat*mat:\n" << mat*mat << std::endl;  
    std::cout << "Here is mat*u:\n" << mat*u << std::endl;  
    std::cout << "Here is u^T*mat:\n" << u.transpose()*mat << std::endl; 
    std::cout << "Here is u^T*v:\n" << u.transpose()*v << std::endl;
    std::cout << "Here is u*v^T:\n" << u*v.transpose() << std::endl;  
    std::cout << "Let's multiply mat by itself" << std::endl;  
    mat = mat*mat;  std::cout << "Now mat is mat:\n" << mat << std::endl;
}

点乘和叉乘

对于点积和叉乘积,需要使用dot()和cross()方法。

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{  
    Vector3d v(1,2,3);  
    Vector3d w(0,1,2); 
    cout << "Dot product: " << v.dot(w) << endl; 
    double dp = v.adjoint()*w; // automatic conversion of the inner product to a scalar  
    cout << "Dot product via a matrix product: " << dp << endl;  
    cout << "Cross product:\n" << v.cross(w) << endl;
}
#include <iostream>
#include <Eigen/Dense>
using namespace std;
int main()
{  
    Eigen::Matrix2d mat;
    mat << 1, 2,         3, 4;
    cout << "Here is mat.sum():       " << mat.sum()       << endl;  
    cout << "Here is mat.prod():      " << mat.prod()      << endl; 
    cout << "Here is mat.mean():      " << mat.mean()      << endl; 
    cout << "Here is mat.minCoeff():  " << mat.minCoeff()  << endl;  
    cout << "Here is mat.maxCoeff():  " << mat.maxCoeff()  << endl; 
    cout << "Here is mat.trace():     " << mat.trace()     << endl;
}

数组的运算(未完待续)

Eigen最小二乘估计

最小平方求解的最好方法是使用SVD分解。 Eigen提供一个作为JacobiSVD类,它的solve()是做最小二乘解。式子为Ax=b
经过和Matlab对比。

#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main()
{   
    MatrixXf A = MatrixXf::Random(3, 2);  
    cout << "Here is the matrix A:\n" << A << endl;  
    VectorXf b = VectorXf::Random(3);   
    cout << "Here is the right hand side b:\n" << b << endl;  
    cout << "The least-squares solution is:\n"        << A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b) << endl;
}

这里写图片描述

### 如何使用Eigen #### 安装与配置 为了使用Eigen,在本地环境中安装并配置是必要的。对于大多数Linux发行版,可以通过包管理器来安装Eigen: ```bash sudo apt-get install libeigen3-dev ``` 如果采用源码编译的方式,则可以从官方仓下载最新版本的Eigen,并解压到合适的位置。 在构建基于Eigen的应用程序时,需告知编译工具链Eigen头文件所在路径。例如,在`CMakeLists.txt`中指定包含目录[^3]: ```cmake include_directories("/usr/include/eigen3") ``` 这一步骤确保了编译期间能够找到Eigen提供的模板定义。 #### 基本用法示例 下面给出一段简单的代码片段展示如何创建矩阵对象以及执行基本操作: ```cpp #include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int main() { MatrixXd m(2, 2); // 创建一个2x2双精度浮点型矩阵 m << 1, 2, 3, 4; // 使用逗号分隔符初始化元素值 VectorXd v(2); v << 5, 6; // 初始化列向量 cout << "Here is the matrix m:\n" << m << endl; cout << "Here is the vector v:\n" << v << endl; // 执行乘法运算并将结果存储在一个新的变量里 VectorXd result = m * v; cout << "m*v =" << endl << result << endl; } ``` 上述例子展示了如何声明矩阵和向量、填充数据以及完成一次标准的矩阵-向量相乘计算[^1]。 #### 获取更多帮助资源 除了查阅官方文档外,还可以访问官方网站获取详细的API说明和其他教程资料。Eigen的设计理念之一就是让用户可以像写MATLAB那样自然流畅地编写高效的C++代码,因此其文档也特别注重易读性和实用性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值