Eigen用法

这篇博客详细介绍了Eigen库的使用,包括矩阵和向量的初始化、赋值、算术运算、属性计算以及相似度度量。示例中展示了如何创建不同尺寸的矩阵和向量,进行加减乘除、转置、共轭、迹、乘积等操作,并计算Pearson相关系数和余弦相似度。此外,还涉及了向量的范数和统计属性的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Eigen网址:

https://eigen.tuxfamily.org/dox/classEigen_1_1MatrixBase.html

可以查阅相关类的介绍以及API

使用:

51     //initialize
 52     std::map<int, Eigen::VectorXf> mp;
 53     mp[1].resize(400);
 54 
 55     Eigen::VectorXf x1;
 56     cout << "size:" << x1.size() << endl;
 57 
 58     Eigen::Vector2d u(-2, 3), v(4, 5);
 59 
 60     Eigen::MatrixXd m(2, 3);//2行3列
 61     m << 1, 11, 12,         //初始化
 62       2, 22, 23;
 63 
 64     //assign
 65     m(0, 0) = 2;
 66     Eigen::VectorXf x;
 67     x.resize(3);
 68     for (int i = 0; i < 2; ++i)
 69         x(i, 0) = i;
 70     cout << "size:" << x.size() << endl;
 71     cout << "data:" << *(x.data()) << " " << *(x.data()+1)  << endl;
 72     x.resize(0);
 73     cout << "size:" << x.size() << endl;    

76     //arithmetic
 77     cout << "+\n" << u + v << endl;;
 78     cout << "-\n" << u - v << endl;;
 79     cout << "*\n" << u * 2 << endl;
 80     cout << "/\n" << u / 2 << endl;
 81 
 82     cout << "T\n" << u.transpose() << endl;
 83     cout << "-\n" << u.conjugate() << endl;
 84     cout << "*\n" << u.adjoint() << endl;
 85 
 86     //multiplication
 87     cout << "transpose\n" << u.transpose() * v << endl;
 88     cout << "dot\n" << u.dot(v) << endl;
 89 
 90     //math
 91     cout << "sum\n" << u.sum() << endl;
 92     cout << "mean\n" << u.mean() << endl;
 93     cout << "trace\n" << u.trace() << endl;//对角线和
 94     cout << "prod\n" << u.prod() << endl;//各元素间乘积
  95 
 96     //Similarity
 97     cout << "lpNorm---------" << endl;
 98     cout << (u - v).lpNorm<1>() << endl;
 99     cout << (u - v).lpNorm<2>() << endl;
100     cout << (u - v).lpNorm<Eigen::Infinity>() << endl;
101 
102     cout << "dot---------" << endl;
103     cout << u.dot(v) << endl;

105     //pearson
106     float mean1 = u.mean();
107     float mean2 = v.mean();
108     auto r1 = (u.array() - mean1);
109     auto r2 = (v.array() - mean2);
110     float t_dot = r1.matrix().dot(r2.matrix());
111 
112     Eigen::Vector2d t_v1 (r1.pow(2));
113     Eigen::Vector2d t_v2 (r2.pow(2));
114 
115     cout << "pearson---------" << endl;
116     float t_dot2 = std::sqrt(t_v1.sum() * t_v2.sum());
119     t_dot2 = std::sqrt(t_dot2);
120     cout << "t_dot2 " << t_dot2 << endl;
121     float res = t_dot / t_dot2;
122     cout << res << endl;


124     //cos
125     float c_v = u.dot(v);
126     Eigen::Vector2d t_c1 (r1.pow(2));
127     Eigen::Vector2d t_c2 (r2.pow(2));
128     cout << "cos---------" << endl;
129     cout << c_v / std::sqrt(t_c1.sum() * t_c2.sum()) << endl;

类关系:

Matrix类,继承于PlainObjectBase;

PlainObjectBase最终会使用MatrixBase/ArrayBase

MatrixBase继承于DenseBase

因此看接口的话,可以看DenseBase,MatrixBase,Matrix类

### 如何使用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
发出的红包

打赏作者

MyObject-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值