热门标签 | 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的ctypes库来调用C++代码。具体实例为实现一个简单的加法器,并详细说明了从编写C++代码到编译及最终在Python中调用的全过程。 ... [详细]
  • 本文探讨了如何在 Spring MVC 框架下,通过自定义注解和拦截器机制来实现细粒度的权限管理功能。 ... [详细]
  • Vue CLI 基础入门指南
    本文详细介绍了 Vue CLI 的基础使用方法,包括环境搭建、项目创建、常见配置及路由管理等内容,适合初学者快速掌握 Vue 开发环境。 ... [详细]
  • 深入探讨前端代码优化策略
    本文深入讨论了前端开发中代码优化的关键技术,包括JavaScript、HTML和CSS的优化方法,旨在提升网页加载速度和用户体验。 ... [详细]
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • 汇编语言:编程世界的始祖,连C语言都敬畏三分!
    当C语言还在萌芽阶段时,它首次接触到了汇编语言,并对其简洁性感到震惊。尽管汇编语言的指令极其简单,但它却是所有现代编程语言的基础,其重要性不言而喻。 ... [详细]
  • 本文深入探讨了Linux内核中进程地址空间的设计与实现,包括虚拟地址空间的概念、内存描述符`mm_struct`的作用、内核线程与用户进程的区别、进程地址空间的分配方法、虚拟内存区域(VMA)的结构以及地址空间与页表之间的映射机制。 ... [详细]
  • 本文提供了一种有效的方法来解决当Android Studio因电脑意外重启而导致的所有import语句出现错误的问题。通过清除缓存和重建项目结构,可以快速恢复开发环境。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • OBS Studio自动化实践:利用脚本批量生成录制场景
    本文探讨了如何利用OBS Studio进行高效录屏,并通过脚本实现场景的自动生成。适合对自动化办公感兴趣的读者。 ... [详细]
  • 本文介绍了在Linux环境下如何有效返回命令行状态、上一级目录及快速查找头文件和函数定义的方法。包括处理长时间运行命令、编辑器退出技巧、目录导航以及文件搜索策略。 ... [详细]
  • 小编给大家分享一下Vue3中如何提高开发效率,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获, ... [详细]
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社区 版权所有