C++数学库 & Eigen导致工程执行文件变大问题
- 1 背景
- 2 Eigen
- 4 知识点
- 4.1 奇异值分解(SVD)
- 4.2 矩阵分解 (decomposition, factorization)
- 4.3 矩阵
- 参考
1 背景
最近项目中,涉及到矩阵运算,同事使用Eigen数学库实现对应的算法功能后,生成的执行文件很大,大概大了30MB,我是感觉不能忍的。所以就去分析问题在哪,最后发现算法中用到了奇异值分解,这是导致变大的很大一个原因,矩阵其实不是特别大,用求逆就行,奇异值分解就大材小用了。最后发现直接求逆,CPU消耗、时间消耗都更合理。
之后自己就去总结下,当下的C++数学库。
2 Eigen
Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。Eigen是一个开源库,从3.1.1版本开始遵从MPL2许可。
概述
- Eigen适用范围广
支持包括固定大小、任意大小的所有矩阵操作,甚至是稀疏矩阵。 - 运算速度快。
表达式模板允许智能地删除临时对象,并在适当的时候启用延迟求值。固定大小的矩阵得到了充分的优化,避免了动态内存分配,并在有意义时展开循环。对于大型矩阵,需要特别注意缓存友好性。 - 可靠
算法的可靠性是经过精心挑选的。可靠性方面有清晰的文档和非常安全的分解作为保证。
Eigen通过自己的测试套件(超过500个可执行程序)、标准BLAS测试套件和部分LAPACK测试套件进行了全面测试。 - 优雅
由于有了表达式模板,这个API非常干净和富有表现力,同时对c++程序员来说感觉很自然。在Eigen上实现算法感觉就像复制伪代码。 - Eigen有很好的编译器支持
因为在许多编译器上运行验证过官方的测试套件,以保证可靠性和解决任何编译器错误。Eigen也是标准c++ 98,并且维护了非常合理的编译时间。
文档
直接在官网找到
要求
仅需要头C++标准库。
官方使用CMake,创建文档、单元测试并自动化安装。
许可
Eigen从 3.1.1 版本开始免费,遵从MPL2协议,也就是简单弱版协议。
早期的版本遵从LGPL3+协议。
几乎任何软件都可以使用本库。例如,闭源软件可以使用Eigen而不必公开自己的源代码。许多专有和封闭源代码的软件项目现在都在使用Eigen,还有许多bsd授权的项目。
Eigen是标准的C ++ 98,因此理论上应该与任何兼容的编译器兼容。每当我们使用某些非标准功能时,该功能都是可选的,可以禁用。
Eigen已成功与以下编译器一起使用:
GCC 4.8版及更高版本。较旧版本的gcc可能也可以正常工作,但不再进行测试。
MSVC(Visual Studio),2012及更高版本。请注意,启用IntelliSense(/ FR标志)已知会触发一些内部编译错误。Eigen的旧版本3.2支持MSVC 2010,而版本3.1支持MSVC 2008。
英特尔C ++编译器。强烈建议启用-inline-forceinline选项。
LLVM / CLang ++,版本3.4及更高版本。(2.8版本以前可以正常工作,但是未在最新版本的Eigen上进行过测试)
XCode 7及更高版本。基于LLVM / CLang。
MinGW,最新版本。基于GCC。
QNX的QCC编译器。
关于性能,Eigen在基于GCC或LLVM / Clang的编译器中表现最佳。有关某些已知的编译问题,请参见此页面。
4 知识点
4.1 奇异值分解(SVD)
奇异值分解(singular value decomposition, SVD):将矩阵分解为奇异向量(singular vector)和奇异值(singular value)。通过奇异值分解,我们会得到一些与特征分解相同类型的信息。然而,奇异值分解有更广泛的应用。每个实数矩阵都有一个奇异值分解,但不一定都有特征分解。例如,非方阵的矩阵没有特征分解,这是我们只能使用奇异值分解。
4.2 矩阵分解 (decomposition, factorization)
矩阵分解 (decomposition, factorization)是将矩阵拆解为数个矩阵的乘积,可分为三角分解、满秩分解、QR分解、Jordan分解和SVD(奇异值)分解等,常见的有三种:1)三角分解法 (Triangular Factorization),2)QR 分解法 (QR Factorization),3)奇异值分解法 (Singular Value Decompostion)。
4.3 矩阵
矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中:
在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;
计算机科学中,三维动画制作、图像识别和一些算法也需要用到矩阵;
矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。
- 在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;
- 计算机科学中,三维动画制作、图像处理、机械臂运动控制、CAD、OpenGL等都有大量应用。
参考
1、Eigen官网
2、百科–矩阵
3、百科–Eigen
4、矩阵奇异值分解简介及C++/OpenCV/Eigen的三种实现
5、用Eigen求解线性方程组
6、Qt开发笔记之线性代数:线性代数矩阵以及Eigen库的介绍、编译和使用