总目录
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;
}