Tutorial de introducción a la biblioteca Eigen

 La biblioteca Eigen definitivamente es familiar para muchas personas que necesitan hacer SLAM, imagen, conducción automática, etc.

En primer lugar, los estudiantes que sean capaces, lean los documentos oficiales. Este es el lugar más completo para encontrar materiales didácticos:

Eigen https://eigen.tuxfamily.org/index.php?title=Main_Page El contenido principal de este artículo también proviene del sitio web oficial.

La característica más notable de la biblioteca Eigen es que solo necesita incluir archivos de encabezado cuando se usa (es una biblioteca creada exclusivamente con archivos de encabezado) y no es necesario vincular la biblioteca. Por lo tanto, al usar herramientas como cmake, solo necesita agregar    find_package (Eigen3 REQUERIDO)  sin enlace. O agréguelo a través de include_directories(\eigen-3.4.0) (usado a menudo en PC).

Ignore el proceso de instalación aquí (muy simple), pero preste atención a la versión de Eigen de la que depende el proyecto.

Primero un breve ejemplo:

#include <iostream>
#include <eigen3/Eigen/Dense>   //Dense是最常用的

using namespace std;
using namespace Eigen;

int main()
{
    MatrixXd m(2,2);
    MatrixXd n(2,2);//MatrixXd  代表X维度(Dynamic)的矩阵
    m(0,0) = 3;
    m(1,0) = 2.5;
    m(0,1) = -1;
    m(1,1) = m(1,0) + m(0,1);
    n<<1, 1,
            1,1;     //通过操作符重载赋值
    cout << m <<endl;
    cout << n <<endl;
}


//输出为
// 3  -1
//2.5 1.5
//1 1
//1 1

 Significa que se ha utilizado nuestro Eigen. Entonces, el denso escrito arriba es el más utilizado, ¿cómo elegimos cuándo lo incluimos?

 La explicación es la anterior, entonces, ¿por qué se usa a menudo Dense? Porque un Dense incluye archivos de encabezado Core, Geometry, LU, Cholesky, SVD, QR y Eigenvalues.

Ok, continuemos. Eigen proporciona dos tipos de matriz de matriz de objeto denso y vector vectorial, que están representados por la clase de plantilla Matrix. Para arreglos unidimensionales y bidimensionales, están representados por la matriz Array de plantilla . La sintaxis es como sigue:

typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyMatrixType;
typedef Array<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyArrayType;

 Donde Scalar representa el tipo de constante, por ejemplo floatdoubleboolint等等。

RowsAtCompileTime Y ColsAtCompileTime  represente el número de filas y columnas, o use Dinámico, dinámico

Las opciones pueden elegir ColMajor o RowMajor  默认是col列排列(也就是行排列还是列排列,互为转置)

合法的写法可以是:

Matrix<double, 6, Dynamic>  m1                // 列是动态的,调用堆
Matrix<double, Dynamic, 2>  m2                // 行是动态的,调用堆
Matrix<double, Dynamic, Dynamic, RowMajor> m3 // 全动态,调用堆
Matrix<double, 13, 3>  m4                     // 全是确定的(通常保存在栈上)

 Por lo general, no necesitamos molestarnos cuando lo usamos, la propia biblioteca ha proporcionado muchas definiciones de tipo:

 Todos sabemos que las dimensiones y las operaciones son particularmente importantes para las matrices, entonces, ¿qué transformaciones tienen las matrices y los arreglos?

Array44f a1, a1;                  //定义两个数组(二维)和两个矩阵
Matrix4f m1, m2;
m1 = a1 * a2;                     // 共轭乘积,这样两个向量之积为矩阵(4*4)
a1 = m1 * m2;                     // 两个矩阵相乘,将矩阵转换为向量
a2 = a1 + m1.array();             // 矩阵和向量是不能直接运算的,使用.array()转换
m2 = a1.matrix() + m1;            // 或者.Matrix()的显示转换
ArrayWrapper<Matrix4f> m1a(m1);   // m1a是m1的指代

Vale la pena señalar que los diferentes tipos de tipos de datos no se pueden calcular directamente y se requiere conversión de conversión, como m1.cast<double>() .  

Operaciones básicas de matriz:

 Cabe señalar que MatrixXf::Zero(m, n) y MatrixXf::Identity(m, n) representan respectivamente una matriz de todos los 0 y una matriz con una diagonal de 1.

Escribamos esto por el momento y actualícelo más tarde~

Lectura recomendada: (¡El blogger lo resume muy bien!)

Biblioteca de álgebra lineal Eigen Learning Daquan - Se busca programador

Supongo que te gusta

Origin blog.csdn.net/m0_46611008/article/details/128006586
Recomendado
Clasificación