当前位置:   article > 正文

C++——Eigen库的学习(1)_c++ eigen

c++ eigen

学习Eigen库的初衷在于最近接触到了深度学习模型部署这块,需要进行TensorRT加速,所以C++也是跑不掉必须学会的技能,但是C++没有python中那么方便的numpy库,没法很容易得进行各种numpy矩阵的计算操作,据我现在了解到的,C++中只能用Eigen库去处理矩阵的计算,用二维矩阵去实现张量的计算。本人了解有限,如果有大佬有更好的办法欢迎指点!

一、Eigen库的简介

Eigen库是C++中用于处理矩阵计算的一个库,具有高效简洁的优点,与matlab中矩阵的计算方式与语法高度相似,熟悉matlab的同学可以极快上手该库!

Eigen库仅仅包含一堆头文件,无需编译,安装过程就不多赘述了,自行百度有大量的教程!

二、Eigen中新建一个矩阵

在Eigen中,可以很方便的新建各种大小的矩阵,这里的矩阵与python中的矩阵不是一个概念,切勿混淆!

1.函数MatrixXd

函数:MatrixXd建立一个任意大小的矩阵(n*n),且矩阵中每个元素都是double型,矩阵中的每个元素可以通过下标索引去赋值与查找,如下面的代码片段:

#include <iostream>
#include <Eigen/Dense>
using Eigen::MatrixXd;
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 << m << std::endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

该代码段建立了一个n*n的矩阵m,通过m(n, n)去索引矩阵元素并进行赋值,会输出如下矩阵:

  3  -1
2.5 1.5
  • 1
  • 2

2.函数MatrixXd::Random、MatrixXd::Constant和Eigen::VectorXd

MatrixXd::Random(n, n):新建一个nn的随机矩阵,元素随机赋值;
MatrixXd::Constant(n, n, a):新建一个n
n常量矩阵,元素值用a去赋值;
Eigen::VectorXd:新建一个列向量,元素赋值通过 v << 1,2,3类似的语法进行赋值。

具体的使用方法可以看如下代码段:

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

using Eigen::MatrixXd;

int main()
{
    MatrixXd m = MatrixXd::Random(3, 3);
    m = (m + MatrixXd::Constant(3, 3, 1.2)) * 50;

    std::cout << m << std::endl;

    Eigen::VectorXd v(3);	//新建一个3维的列向量
    v << 1,2,3;		//列向量的赋值

    std::cout << "m * v" << std::endl << m * v << std::endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

该代码段最后将3*3的矩阵与列向量进行了矩阵的乘法,符合 标准矩阵运算,与python中常见的numpy矩阵的运算不太一样,极易混淆!

94.0188  89.844 43.5223
49.4383 101.165  86.823
88.3099 29.7551 37.7775
m * v
404.274
512.237
261.153
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Eigen库除了支持定义随机大小的矩阵,还支持固定大小的矩阵,在定义矩阵时把矩阵大小固定,可以加快编译速度,但如果使用太多规格的矩阵,同时会增加编译时间。

下面使用固定矩阵大小的函数实现上述代码段同样的功能:

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

using namespace Eigen;

int main()
{
    Eigen::Matrix3d m = Eigen::Matrix3d::Random();
    m = (m + Eigen::Matrix3d::Constant(1.2)) * 50;

    std::cout << m << std::endl;

    Eigen::Vector3d v(1,2,3);

    std::cout << "m * v" << std::endl << m * v << std::endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

Eigen::Matrix3d:定义33大小的矩阵;
Eigen::Matrix3d::Random():定义3
3大小的随机矩阵;
Eigen::Matrix3d::Constant(a):定义3*3大小的常量矩阵,用a填充元素值;
Eigen::Vector3d v(1,2,3):定义一个3位列向量并直接赋值。

更多技术欢迎加入交流:320297153

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/79241
推荐阅读
相关标签
  

闽ICP备14008679号