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

学习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;
}

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

  3  -1
2.5 1.5

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;
}

该代码段最后将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

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;
}

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

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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值