赞
踩
学习Eigen库的初衷在于最近接触到了深度学习模型部署这块,需要进行TensorRT加速,所以C++也是跑不掉必须学会的技能,但是C++没有python中那么方便的numpy库,没法很容易得进行各种numpy矩阵的计算操作,据我现在了解到的,C++中只能用Eigen库去处理矩阵的计算,用二维矩阵去实现张量的计算。本人了解有限,如果有大佬有更好的办法欢迎指点!
Eigen库是C++中用于处理矩阵计算的一个库,具有高效简洁的优点,与matlab中矩阵的计算方式与语法高度相似,熟悉matlab的同学可以极快上手该库!
Eigen库仅仅包含一堆头文件,无需编译,安装过程就不多赘述了,自行百度有大量的教程!
在Eigen中,可以很方便的新建各种大小的矩阵,这里的矩阵与python中的矩阵不是一个概念,切勿混淆!
函数: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
MatrixXd::Random(n, n):新建一个nn的随机矩阵,元素随机赋值;
MatrixXd::Constant(n, n, a):新建一个nn常量矩阵,元素值用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():定义33大小的随机矩阵;
Eigen::Matrix3d::Constant(a):定义3*3大小的常量矩阵,用a填充元素值;
Eigen::Vector3d v(1,2,3):定义一个3位列向量并直接赋值。
更多技术欢迎加入交流:320297153
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。