无废话!Eigen库的基本使用代码

目录

一、创建矩阵

1、引用EIGEN

2、创建一个矩阵

3、创建3维向量和3维方阵

4、动态矩阵

5、更简洁的创建

二、矩阵初始化

1、设初值全为0

2、设初值为随机数

三、输入和输出矩阵

1、输入

(1)、全部输入

(2)、局部输入

2、输出

四、矩阵运算

1、矩阵乘法

2、加减运算

3、数乘运算

五、矩阵变换

1、转置

2、求和

3、求迹

4、求逆

5、求行列式的值

 6、求特征值和特征向量

 六、矩阵应用

1、解方程


一、创建矩阵

1、引用EIGEN

//Eigen部分
#include<Eigen/Core>
//稠密矩阵运算
#include<Eigen/Dense>

2、创建一个矩阵

Eigen::Matrix<数据类型,行,列>矩阵名;

//创建一个数据类型为float,2行3列的矩阵,名为mt23
Eigen::Matrix<float,2,3> mt23;

3、创建3维向量和3维方阵

//规则 3维向量
Eigen::Vector3d 向量名;
//创建名为V3d的向量
Eigen::Vector3d V3d;

//规则 3维方阵
Eigen::Matrix3d 方阵名;
//创建名为M3d的方阵
Eigen::Matrix3d M3d;

都是typedef的Matrix,如Vector3d==typedef Matrix<double,3,1>

默认数据类型为double

4、动态矩阵

当不知道该用多大的矩阵时,不妨用动态矩阵(随着插入数据变多自动变大)

Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> 动态矩阵名;

//创建名为DY_MT的动态矩阵
Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> DY_MT;

5、更简洁的创建

Eigen::MatrixXd 矩阵名(行,列);

//创建一个名为M22的2行2列的矩阵
Eigen::MatrixXd M22(2,2);

二、矩阵初始化

1、设初值全为0

Eigen::Matrix3d A;

A=Eigen::Matrix3d::Zero();

注意:不同类型对应不同的变量空间。

2、设初值为随机数

Eigen::Matrix3d A;

A=Eigen::Matrix3d::Random();

三、输入和输出矩阵

1、输入

(1)、全部输入

矩阵名 << v1,v2,v3....

//将1,2,3,4输入到一个2行2列的矩阵m中
m << 1,2,3,4;

//将1,2,3插入到v3向量中
v3 << 1,2,3

此时一行一行的填充

输出:

1  2
3  4

(2)、局部输入

直接利用索引进行更改

注意:索引是从0开始的

//将1,2,3,4一个一个插入到M中
M(0,0)=1;
M(0,1)=2;
M(1,0)=3;
M(1,1)=4;
 
//将1,2,3一个一个插入到v3中
v3(0)=1;
v3(1)=2;
v3(2)=3;

2、输出

cout << 矩阵名 << endl;

四、矩阵运算

1、矩阵乘法

现在有一个矩阵A(m,n),m行n列;还有一个矩阵B(n,k),n行k列。那么A*B=C(m,k),C为m行k列的矩阵。

//创建A(m,n)和B(n,k)
Eigen::MatrixXd A(m,n);
Eigen::MatrixXd B(n,k);

//创建并计算C(m,k)
Eigen::MatrixXd v(m,k) = A*B;

注意:①必须同数据类型才可以直接A*B,当A B数据类型不同时应用cast转化为同一种类型

        例:该方法为显示转换

Eigen::Matrix<float,2,3> m23;

Eigen::Matrix<double,3,2> n32;


//需要将m23转化成double类型才可以相乘
Eigen::Matrix<double,2,2> result;
result=m23.cast<double>()*n32;

           ②C必须为m行k列,否则存不下或者存不对

2、加减运算

同行列矩阵名直接加减。

//创建同类型A和B
Eigen::MatrixXd A(m,n);
Eigen::MatrixXd B(m,n);

//赋值
A << 1,2,3···m*n;
B << 1,2,3···m*n;

//加法
cout << A+B << endl;
//减法
cout << A-B << endl;

3、数乘运算

直接实数m*矩阵名A

//创建矩阵
Eigen::MatrixXd A(m,n);
Eigen::MatrixXd B(m,n);


//赋值
A << 1,2,3···m*n;
B << 1,2,3···m*n;

//数乘运算 k为某一个实数 
B=k*A;

五、矩阵变换

1、转置

A(m,n) 转置后A^{T}(n,m).。

Eigen::Matrix A(m,n);

//打印转置矩阵
cout << A.transpose() << endl;

2、求和

求矩阵各个元素的总和。

cout << A.sum() << endl;

3、求迹

矩阵的迹=矩阵正对角线元素的和

cout << A.trace() << endl;

4、求逆

A*A^{-}=E

cout << A.inverse() << endl;

5、求行列式的值

必须为m行m列才可以

cout << A.determinant() << endl;

 6、求特征值和特征向量

首先,你要知道要方阵(m行m列)才有特征值和特征向量

A\alpha =\lambda \alpha

//首先创建一个3维方阵(3,3)
Eigen::Matrix3d A;

//给A赋值
A << 1,0,0,0,2,0,0,0,3;

//利用SelfAdjointEigenSolver创建一个解决器 在此解决器中自动算出特征向量和特征值
Eigen::SelfAdjointEigenSolver<Eigen::矩阵类型> 解决器名 (需要求特征值的向量名);
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver (A);

//调用解决器的方法 打印特征值和特征向量
cout << eigen_solver.eigenvalues() << endl;
cout << eigen_solver.eigenvectors() <<endl;

输出结果如下:

//特征值
1
2
3
//特征向量
1 0 0
0 1 0
0 0 1

 六、矩阵应用

1、解方程

现在有一个方程组,(m个方程,n个未知数,m*n个系数)

a_{11}x_{1}+a_{12}x_{2}+.......+a_{1n}x_{n}=b_{1}

a_{n1}x_{1}+a_{n2}x_{2}+.......+a_{nn}x_{n}=b_{n}

那么解这个方程就可以用矩阵表示Ax=b

其中,A为a_{ij}组成的矩阵;b为b_{i}组成的列向量;x为x_{j}组成的列向量

下面求解x:(当m=n时并且有唯一解)

① 最简单暴力的方法就是Ax=b方程左右两边同时乘上A的逆矩阵A^{-};

这样我们就得到了式子x=A^{-}*b

下面是代码:

//创建A,b向量并赋值
Eigen::Matrix<double,n,n> A;
A << ···;
Eigen::Matrix<double,n,1> b;
b << ···;

//创建x向量
Eigen::Matrix<double,n,1> x;

//暴力计算
x=A.inverse()*b;

注:该方法很慢!效率底下!不推荐!

②矩阵分解,我们用QR分解(函数colPivHouseholderQr),速度会快很多

你只需记住代码,并且知道这种快!

//创建A,b并赋值
Eigen::Matrix<double,n,n> A;
A << ···;
Eigen::Matrix<double,n,1> b;
b << ···;

//创建x并计算
Eigen::Matrix<double,n,1> x;

//你需要记住的代码
x=A.colPivHouseholderQr().solve(b);

//打印
cout << x << endl;

### DeepSeek 的功能与用途介绍 #### 支持多样化应用场景 DeepSeek 提供了广泛的应用场景支持,不仅限于开发者的API需求,还在Chat和Code两个特定领域展现了卓越的能力[^1]。这使得该平台能够适应多种工作流环境下的智能化交互。 #### 多令牌预测技术实现 通过采用先进的多令牌预测(Multi-Token Prediction, MTP)机制,如图5所示的技术架构所展示的那样,DeepSeek能够在单次请求中处理多个输入单元的信息传递过程[^2]。这种设计显著提高了模型对于复杂语境的理解能力和响应效率。 #### 用户友好型特性集合 为了提升用户体验并满足不同层次的需求,DeepSeek集成了若干实用工具和服务。除了基本的文字交流外,还包括但不限于: - **语言转换服务**:允许跨语言沟通无障碍; - **创作辅助模块**:帮助创作者激发灵感、撰写文案; - **程序编写助手**:提供代码建议和技术文档解析; - **难题解答器**:针对学术研究或日常学习中的疑问给予指导; - **资料分析专家**:协助科研人员理解专业文献的核心要点; - **行程策划师**:为旅行爱好者制定个性化旅游方案; 特别值得一提的是,“拍照识别文字”的加入进一步拓宽了产品的适用范围,让用户可以轻松获取图像内的文本信息[^3]。 ```python # 示例:调用DeepSeek API进行图片转文字操作 import requests def ocr_image(image_path): url = "https://api.deepseek.com/vision/ocr" files = {'file': open(image_path, 'rb')} response = requests.post(url, files=files) result = response.json() return result['text'] print(ocr_image('example.jpg')) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值