热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++数学库Eigen导致工程执行文件变大问题

C数学库&Eigen导致工程执行文件变大问题1背景2Eigen概述文档要求许可4知识点4.1奇异值分解(SVD)4.2矩阵分解(decompositio

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库的介绍、编译和使用


推荐阅读
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了使用Rust语言编写、保存和编译程序的简单步骤。首先,打开记事本文件并编写程序代码,然后将代码保存到一个以.rs为扩展名的文件中。接下来,使用rustc命令来编译运行程序。最后,通过命令行运行编译后的程序,得到输出结果。如果遇到编译错误,可以下载Build Tools for Visual Studio 2017来解决。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 解决文件名过长下载失败问题的jQuery方案
    本文介绍了使用jQuery解决文件名过长导致下载失败的问题。原方案中存在文件名部分丢失的问题,通过动态生成隐藏域表单并提交的方式来解决。详细的解决方案和代码示例在文章中给出。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • VSCode快速查看函数定义和代码追踪方法详解
    本文详细介绍了在VSCode中快速查看函数定义和代码追踪的方法,包括跳转到定义位置的三种方式和返回跳转前的位置的快捷键。同时,还介绍了代码追踪插件的使用以及对符号跳转的不足之处。文章指出,直接跳转到定义和实现的位置对于程序员来说非常重要,但需要语言本身的支持。以TypeScript为例,按下F12即可跳转到函数的定义处。 ... [详细]
  • 1、工具VS2015OpenCV3.20下载地址:https:sourceforge.netprojectsopencvlibrary2、步骤1.下载工具ÿ ... [详细]
author-avatar
热情article文章_673_621
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有