基本概念 公式类型 在Eigen中,存在特殊的expression(公式类型),其返回类型为Derived(导出类型)。在实现上具体的说,其实际上是由模板元实现,从而避免了传统编程下通过值传递导致效率损失。 假设一个公式"D=A*B+C",这个公式的右侧"A*B+C"在eigen中实际上是存储为一个对象(构建了一个表达式树),在"="执行时才发生实际的计算,而"A*B+C"的类型和"D"的类型实际上不同,其是一个非左值对象。 返回值为Vector的,一般称为Vector表达式 返回值为Matrix的,一般称为Matrix表达式 也称为延迟求值(或者惰性求值)。 也意味着使用类似于“A=A*B”这种型式,这会导致计算时发生覆盖(实际上对于这种乘法情况eigen会创建一个临时变量使计算正确,但依旧不推荐)
基础类型 1 2 3 4 5 6 7 8 9 10 11 12 MatrixBase ArrayBase DenseBase EigenBase
方法 Eigen::Vector3f/Eigen::VectorXf下方法
DenseBase 下方法 只能作用于稠密类型
可变对象引用 1 2 //允许将矩阵的数据内容以引用的方式传递,但不要求是相同的数据类型 Eigen::Ref<EigenType>(Type)
辅助功能 打印矩阵信息 1 2 std::cout<<A<<std::endl;
自定义下标访问规则 1 2 const typename ArgType::Scalar& operator () (Eigen::Index row, Eigen::Index col) const ;
多行列索引 1 2 3 4 5 6 7 8 9 10 11 A = 1804289383 -1550966999 1365180540 336465782 -465790871 -1122281286 304089172 -1868760786 -189735855 -1364114958 35005211 -2309581 719885386 2044897763 -1852781081 1101513929 A ([1 2 1 ], [3 2 1 0 0 2 ]) =-1868760786 304089172 -1122281286 -465790871 -465790871 304089172 -2309581 35005211 -1364114958 -189735855 -189735855 35005211 -1868760786 304089172 -1122281286 -465790871 -465790871 304089172
特殊的宏 编译相关 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 EIGEN_DEFAULT_DENSE_INDEX_TYPE EIGEN_DEFAULT_IO_FORMAT EIGEN_INITIALIZE_MATRICES_BY_ZERO EIGEN_INITIALIZE_MATRICES_BY_NAN EIGEN_NO_AUTOMATIC_RESIZING EIGEN_MAX_CPP_VER EIGEN_HAS_C99_MATH EIGEN_HAS_STD_RESULT_OF EIGEN_NO_IO EIGEN_NO_DEBUG EIGEN_NO_STATIC_ASSERT eigen_assert EIGEN_MALLOC_ALREADY_ALIGNED EIGEN_MAX_ALIGN_BYTES EIGEN_MAX_STATIC_ALIGN_BYTES EIGEN_DONT_PARALLELIZE EIGEN_DONT_VECTORIZE EIGEN_UNALIGNED_VECTORIZE EIGEN_FAST_MATH EIGEN_UNROLLING_LIMIT EIGEN_STACK_ALLOCATION_LIMIT EIGEN_NO_CUDA EIGEN_STRONG_INLINE EIGEN_DEFAULT_L1_CACHE_SIZE EIGEN_DEFAULT_L2_CACHE_SIZE EIGEN_DEFAULT_L3_CACHE_SIZE EIGEN_ALTIVEC_ENABLE_MMA_DYNAMIC_DISPATCH EIGEN_ALTIVEC_DISABLE_MMA EIGEN_ALTIVEC_USE_CUSTOM_PACK EIGEN_ARRAY_PLUGIN EIGEN_ARRAYBASE_PLUGIN EIGEN_CWISE_PLUGIN EIGEN_DENSEBASE_PLUGIN EIGEN_DYNAMICSPARSEMATRIX_PLUGIN EIGEN_FUNCTORS_PLUGIN EIGEN_MAPBASE_PLUGIN EIGEN_MATRIX_PLUGIN EIGEN_MATRIXBASE_PLUGIN EIGEN_PLAINOBJECTBASE_PLUGIN EIGEN_QUATERNION_PLUGIN EIGEN_QUATERNIONBASE_PLUGIN EIGEN_SPARSEMATRIX_PLUGIN EIGEN_SPARSEMATRIXBASE_PLUGIN EIGEN_SPARSEVECTOR_PLUGIN EIGEN_TRANSFORM_PLUGIN EIGEN_VECTORWISEOP_PLUGIN EIGEN_DEFAULT_TO_ROW_MAJOR EIGEN_INTERNAL_DEBUGGING EIGEN_NO_MALLOC EIGEN_RUNTIME_NO_MALLOC
代码检测 1 2 3 4 5 6 7 8 9 10 11 12 13 EIGEN_STATIC_ASSERT_FIXED_SIZE (TYPE) EIGEN_STATIC_ASSERT_DYNAMIC_SIZE (TYPE) EIGEN_STATIC_ASSERT_LVALUE (Derived) EIGEN_STATIC_ASSERT_ARRAYXPR (Derived) EIGEN_STATIC_ASSERT_SAME_XPR_KIND (Derived1, Derived2) EIGEN_STATIC_ASSERT_VECTOR_ONLY (TYPE) EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE (TYPE, SIZE) EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE (TYPE, ROWS, COLS) EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE (TYPE0,TYPE1) EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE (TYPE0,TYPE1) EIGEN_STATIC_ASSERT_SIZE_1x1 (TYPE)
并行执行 Eigen的并行执行,需要基于OpenMP,在编译时启用。
1 2 3 4 5 6 7 OMP_NUM_THREADS=n ./my_program omp_set_num_threads (n);Eigen::setNbThreads (n); n = Eigen::nbThreads ( );
多线程执行环境 1 2 //对于eigen3.3以及c++11之前的版本,需要在创建线程之前初始化Eigen Eigen::initParallel();