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


推荐阅读
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • vivo Y5s配备了联发科Helio P65八核处理器,这款处理器采用12纳米工艺制造,具备两颗高性能Cortex-A75核心和六颗高效能Cortex-A55核心。此外,它还集成了先进的图像处理单元和语音唤醒功能,为用户提供卓越的性能体验。 ... [详细]
  • 雨林木风 GHOST XP SP3 经典珍藏版 V2017.11
    雨林木风 GHOST XP SP3 经典珍藏版 V2017.11 ... [详细]
  • Hadoop发行版本选择指南:技术解析与应用实践
    本文详细介绍了Hadoop的不同发行版本及其特点,帮助读者根据实际需求选择最合适的Hadoop版本。内容涵盖Apache Hadoop、Cloudera CDH等主流版本的特性及应用场景。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 本文将详细介绍多个流行的 Android 视频处理开源框架,包括 ijkplayer、FFmpeg、Vitamio、ExoPlayer 等。每个框架都有其独特的优势和应用场景,帮助开发者更高效地进行视频处理和播放。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
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社区 版权所有