`

Eigen库:那些年我们一起经历的bug

c++ 
阅读更多
1、使用auto声明新变量时不要局部eval()
这句话神马意思呢? 我们知道,在C++函数中最好不要返回局部变量,否则可能产生因为局部变量被回收而引发的错误。
而这个问题正是源于此。
在以下这个bug中:
http://eigen.tuxfamily.org/bz/show_bug.cgi?id=505 
“a*b”就会引发自动的eval(),从而产生局部变量,该局部变量被一个表达式所引用,导致结果不可预知。
最新版本的Eigen已经解决了这个问题~~~那么,这个bug是不是完全不存在了呢?
答案是NO。。。。
看以下的代码:

    auto A_mul_B_plus_C = C + (A * B).colwise().sum();
    auto A_mul_B_Eval_plus_C = C + (A * B).colwise().sum().eval();

二者的结果都是表达式,但是第二个表达式中局部变量被eval()了,产生了一个临时的Matrix,该临时变量会被回收,导致结果的不正确。
解决方案:
  • 1、不使用auto A_mul_B_Eval_plus_C,而是使用MatrixXd A_mul_B_Eval_plus_C这类的显式声明。(但这样不够灵活有没有!)
  • 2、使用eval(),对,你没看错,但是是在整条语句上使用eval();比如:auto A_mul_B_plus_C_EvalAll = (C + (A * B).colwise().sum().eval() ).eval(); //如果该变量要多次使用,推荐这种做法,这种做法也是最安全的(不会因为Eigen库还有之前a*b产生局部变量引发的错误)
  • 3、完全不使用eval(); 比如:auto A_mul_B_plus_C = C + (A * B).colwise().sum();

完整的代码参见:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=883
更深入了解这个bug看下面这个链接:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=99

2、不用eval()也是不行的!(最新版本(3.2.2)不存在这个问题了)
也许你会有所疑问,我干嘛要手动eval()呢?
这源于另一个bug:
一年前接触Eigen库的时候,写过这么一段代码

      Eigen::MatrixXd m=Eigen::MatrixXd::Ones(3,4);
      m.array().rowwise()/=m.array().colwise().sum();
      std::cout<<m<<std::endl;

结果大跌眼镜(最新版本的输出没问题了):
  • 0.333333 0.333333 0.333333 0.333333
  • 0.428571 0.428571 0.428571 0.428571
  • 0.567568 0.567568 0.567568 0.567568

原因可能是等号右边时表达式,左边每行除以右边时,右边的表达式都会被重新计算。。。
所以当时的版本必须eval()一下!好在现在这个bug消除了!
另外多说一句,基于效率考虑,可能也要eval()一下,但是我调了下代码,当前版本的Eigen右侧的表达式是只计算一遍的,放心的不eval()吧!
分享到:
评论

相关推荐

    eigen库使用方法.zip

    **Eigen库使用方法** Eigen是一个开源的C++矩阵和向量库,专为数值计算而设计,它在C++环境中提供了高效、灵活且易于使用的线性代数操作。Eigen库适用于各种应用场景,包括机器学习、图像处理、物理模拟等,其核心...

    eigen库使用教程,使用说明文档

    **Eigen库深度解析与使用指南** Eigen库是一个开源的C++矩阵和向量运算库,专为数值计算设计。它提供了高效、灵活且易于使用的接口,广泛应用于机器学习、计算机图形学、信号处理等多个领域。本教程将详细介绍Eigen...

    c++ 的eigen库:eigen-3.3.7

    去官网下载的目前最新版的eigen库 官网链接:http://eigen.tuxfamily.org/index.php?title=Main_Page#Download

    C++调用Eigen库技巧的直观理解.docx

    C++调用Eigen库技巧的直观理解 C++调用Eigen库是指在C++语言中使用Eigen库来进行矩阵运算。Eigen库是一个高性能的矩阵库,提供了许多实用的矩阵运算函数和类。下面是Eigen库的一些常用函数和使用方法: 1. IDE设置...

    Eigen库的简单实用说明

    ### Eigen库的简单实用说明 #### 一、引言与背景 Eigen库是一个高性能的线性代数库,主要用于C++编程语言。由于其高效性和灵活性,被广泛应用于科学计算、机器学习等领域。本篇文章基于一份针对Eigen库的快速上手...

    Eigen类库的中文简易教程

    Eigen是一个开源的C++矩阵和向量库,它专注于高效、灵活和易于使用。这个库被广泛应用于数值计算、机器学习、计算机视觉等多个领域。本教程将帮助你理解并掌握如何利用Eigen进行矩阵运算和线性代数操作。 ## 1. ...

    C++ Eigen库计算矩阵特征值及特征向量

    今天,我们将重点介绍Eigen库在计算矩阵特征值及特征向量方面的应用。 什么是矩阵特征值和特征向量 在线性代数中,矩阵的特征值和特征向量是矩阵的两个重要特征。特征值是矩阵的一种 scalar,满足特征方程式 Ax = ...

    Eigen和fftw3的库

    **Eigen库** Eigen是一个开源的C++库,专门用于处理线性代数问题。它提供了高效、简洁且灵活的接口,使得在C++程序中进行矩阵运算和向量操作变得非常简便。Eigen库的设计目标是速度和易用性,它支持多种数据类型,...

    Qt/C++特征分解eig奇异值分解SVD库

    Eigen库是这个领域的关键组件,它提供了与MATLAB相似的功能,使得开发人员能够在桌面应用程序中执行复杂的数值计算,特别是在信号处理、图像分析、机器学习等领域。以下将详细介绍Eigen库中的特征值分解(eig)、...

    C++eigen库和dlib库使用笔记.md

    ### C++ Eigen库和Dlib库使用指南 #### 一、引言 随着现代软件开发对性能需求的不断提高,特定领域的高效库变得越来越重要。在众多高性能库中,Eigen和Dlib是两个非常值得关注的选择。Eigen专注于线性代数运算,而...

    Eigen库C++版,cmake过了配置就能用

    首先,让我们详细了解一下Eigen库。Eigen库提供了一个头文件库(header-only library)的实现,这意味着你只需要包含所需的头文件,而无需进行额外的编译步骤。它支持各种矩阵运算,如矩阵乘法、求逆、特征值、解...

    矩阵的qr分解,特征值计算,谱分解

    在C++中,我们可以使用Eigen库的`Eigen::EigenSolver&lt;MatrixXf&gt;`类,如下: ```cpp Eigen::MatrixXf A = ...; // 初始化矩阵A Eigen::EigenSolver&lt;Eigen::MatrixXf&gt; es(A); std::vector&lt;std::complex&lt;double&gt;&gt; ...

    Eigen: C++开源矩阵计算工具

    在实际项目中,Eigen3常与其他C++库如OpenCV(计算机视觉库)和NumPy(Python科学计算库)一起使用,以构建高性能的算法。由于其接口简洁,学习曲线相对平缓,对于C++开发者来说,Eigen是进行矩阵计算的理想选择。 ...

    Eigen 3 库文件及 unsupported 文件

    Eigen 3 是一个开源的C++数学库,主要用于线性代数操作,包括向量、矩阵以及相关的运算。它在TensorFlow这样的深度学习框架中扮演着核心角色,因为高效的矩阵运算对于训练神经网络至关重要。Eigen库的设计简洁且高效...

    EIGEN安装包 (C++矩阵运算)

    EIGEN是一个开源的C++库,专门用于线性代数、矩阵和向量运算,以及相关的数值算法。它提供了一种高效、灵活且易于使用的接口,使得在C++项目中进行复杂的数学运算变得简单。EIGEN安装包是开发者在Visual Studio或...

    eigen库 最新稳定版3.3.9

    ### Eigen库最新稳定版3.3.9知识点详解 #### 一、Eigen库简介 Eigen是一个全面的C++模板库,用于线性代数运算,包括矩阵和向量运算等。它支持各种矩阵和数组类型,以及广泛的线性代数运算,如矩阵乘法、求逆、特征...

    eigen-eigen-5a0156e40feb.zip_c++ 矩阵_eigen_eigen 库_特征值分解 c++_矩阵特征

    《C++中的Eigen库:矩阵操作与特征值分解详解》 在C++编程语言中,高效处理矩阵运算是一项重要的任务,特别是在科学计算、数据分析和机器学习等...对于那些处理大量矩阵计算的项目来说,Eigen库是一个不可或缺的资源。

    eigen 矩阵运算库文档手册

    **Eigen 矩阵运算库文档手册** Eigen 是一个开源的 C++ 库,专门用于高效、简洁地处理线性代数问题,包括向量、矩阵以及更复杂的运算。它被广泛应用于计算机图形学、机器学习、物理模拟等多个领域。Eigen 的设计...

    Eigen3检查安装测试代码

    首先,我们需要确保Eigen3库已经正确安装在系统中。Eigen3通常不需要编译,因为它是头文件库,可以直接在项目中包含所需的头文件。你可以通过在项目中引用Eigen3的主头文件`&lt;Eigen/Dense&gt;`或`&lt;Eigen/Core&gt;`来测试...

    C++ 【Eigen】模板库下载

    Eigen是一个在C++编程语言中广泛使用的开源矩阵和向量操作库,专注于高效、简洁的线性代数运算。这个库被设计为高度优化,能够充分利用现代CPU的特性,如SIMD(单指令多数据)指令,以及在多核处理器上的并行计算。...

Global site tag (gtag.js) - Google Analytics