Eigen库学习笔记(2)—— 密集矩阵和数组操作

总目录
1. 矩阵类
2. 矩阵与向量运算
3. 数组类和系数操作
4. 矩阵和数组转化

一、矩阵类。

包含矩阵和向量。因为向量是行或列为1的特殊矩阵。

Matrix<type, row, col>

·type指参数类型,通常为float。
·row/col指矩阵的行数及列数

矩阵基操之构建矩阵

// Matrix_f/d,_上是数字的,就是静态,是X的,就是动态。f是float,d是double.
Matrix3f m(3,3); //声明3*3的静态矩阵
m << 1,2,3,4,5,6,7,8,9	//矩阵元素为1~9,[[1,2,3],[4,5,6],[7,8,9]]

MatrixXd n(2,4); //声明2*4的动态矩阵
n = MatrixXd::Zeros(2, 4) //全0初始化

Vector3d v(1,2,3);  //3*1的向量,元素为1,2,3
Vector3f w(1,2,3); //同上

//矩阵调整大小 
MatrixXd m(2,5);
m << 1,2,3,4,5,6,7,8,9,10;
m.resize(4,3);    // 可以这样调整,也不报错,但是结果会多出无限小的值

矩阵基操之矩阵运算

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

using namespace Eigen;
using namespace std;

int main()
{
  MatrixXf m(2,2);
  m << 1,2,3,4;
  MatrixXf n(2,2);
  n << 2,3,4,5;
  
  cout << m-n << endl << endl;
  cout << m+n << endl << endl;
  cout << m*n << endl;
}

矩阵基操之向量运算

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

using namespace Eigen;
using namespace std;

int main()
{
  Vector3f m(1,2,3);
  Vector3f n(1,2,3);
  cout << m-n << endl << endl;
  cout << m+n << endl << endl;
  cout << m.dot(n) << endl << endl;  //点乘
  cout << m*n.transpose() << endl << endl;  // 矩阵乘法
  cout << m.corss(n) << endl;  //交叉乘,
}

矩阵基操之基本变换

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

using namespace Eigen;
using namespace std;

int main()
{
  Vector3f m(1,2,3);
  Vector3f n(2,3,4);
  cout << m.transpose() << endl << endl;  //转置
  cout << m.conjugate() << endl << endl;  //共轭
  cout << m.adjoint() << endl << endl;  //伴随
  cout << m.determinant() << endl;  //行列式
  cout << m.inverse() << endl;  //求逆
}
/*
Attention:
对于向量不要用a = a.transpose()这样的写法,会出现BUG。
非要这样的话,用transposeInPlace()
*/

矩阵基操之简约运算

#include <iostream>
#include <Eigen/Dense>
 
using namespace std;
int main()
{
  Eigen::Matrix2d mat;
  mat << 1, 2,
         3, 4;
  cout << mat.sum() << endl;  //所有元素之和
  cout << mat.prod() << endl;  //所有元素之积
  cout << mat.mean() << endl;  //均值
  cout << mat.minCoeff()  << endl;  //最小值
  cout << mat.maxCoeff()  << endl;  //最大值
  cout << mat.trace()  << endl;  //迹
}

二、数组类和系数操作

Array<type, row, col>

赋值方法

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

using namespace Eigen;
using namespace std;

int main()
{
  //ArrayXXf、ArrayXXd、Array33f的形式声明变量
  ArrayXXf  m(2,2);

  // 赋值方法
  m(0,0) = 1.0; m(0,1) = 2.0;
  m(1,0) = 3.0; m(1,1) = m(0,1) + m(1,0);
  cout << m << endl << endl;
  m << 1.0,2,
       3.0,4.0;
  cout << m << endl;
}

数组运算
注意:数组运算的乘除法和矩阵不同,数组是对应位置运算,矩阵遵循矩阵运算法则。除此以外,大多数情况都可以相互替换。

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

using namespace Eigen;
using namespace std;

int main()
{
  ArrayXXf a(3,3);
  ArrayXXf b(3,3);
  a << 1,2,3,
       4,5,6,
       7,8,9;
  b << 1,2,3,
       1,2,3,
       1,2,3;

  // 求和
  cout <<  a + b << endl << endl;

  // 减系数
  cout << a - 2 << endl << endl;

  //乘法
  cout << a*b <<endl << endl;

  //除法
  cout << a/b <<endl;
  
  //简便计算
  ArrayXf b;
  b = a.max(abs(a).sqrt());
  cout << b << endl;
}

各种简便计算的地址
https://eigen.tuxfamily.org/dox-3.3/group__QuickRefPage.html

三、矩阵和数组相互转化

什么时候应该使用Matrix类的对象,什么时候应该使用Array类的对象?
不能直接对数组应用矩阵操作,也不能对矩阵应用数组操作。
因此,如果你需要做线性代数运算,如矩阵乘法,那么你应该使用矩阵;
如果需要进行系数方面的操作,那么应该使用数组。
当需要同时使用Matrix和Array操作的时候,要将一个矩阵转换为一个数组,或者反过来。这样就可以访问所有操作,而不管选择将对象声明为数组还是矩阵。
Eigen库提供了非常简便的转化方法

Matrix.array()
Array.martix()
#include <Eigen/Dense>
#include <iostream>

using namespace Eigen;
using namespace std;

int main()
{
  MatrixXf m(2,2);
  MatrixXf n(2,2);
  MatrixXf result(2,2);

  m << 1,2,
       3,4;
  n << 5,6,
       7,8;

  result = m * n;
  cout << result << endl << endl;
  
  result = m.array() * n.array();
  cout << "-- Array m*n: --" << endl << result << endl << endl;

  result = m.array() + 4;
  cout << "-- Array m + 4: --" << endl << result << endl << endl;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值