基本概念
公式类型
在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();
|