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库深度解析与使用指南** Eigen库是一个开源的C++矩阵和向量运算库,专为数值计算设计。它提供了高效、灵活且易于使用的接口,广泛应用于机器学习、计算机图形学、信号处理等多个领域。本教程将详细介绍Eigen...
**Eigen库使用方法** Eigen是一个开源的C++矩阵和向量库,专为数值计算而设计,它在C++环境中提供了高效、灵活且易于使用的线性代数操作。Eigen库适用于各种应用场景,包括机器学习、图像处理、物理模拟等,其核心...
去官网下载的目前最新版的eigen库 官网链接:http://eigen.tuxfamily.org/index.php?title=Main_Page#Download
C++调用Eigen库技巧的直观理解 C++调用Eigen库是指在C++语言中使用Eigen库来进行矩阵运算。Eigen库是一个高性能的矩阵库,提供了许多实用的矩阵运算函数和类。下面是Eigen库的一些常用函数和使用方法: 1. IDE设置...
### Eigen库的简单实用说明 #### 一、引言与背景 Eigen库是一个高性能的线性代数库,主要用于C++编程语言。由于其高效性和灵活性,被广泛应用于科学计算、机器学习等领域。本篇文章基于一份针对Eigen库的快速上手...
首先,让我们详细了解一下Eigen库。Eigen库提供了一个头文件库(header-only library)的实现,这意味着你只需要包含所需的头文件,而无需进行额外的编译步骤。它支持各种矩阵运算,如矩阵乘法、求逆、特征值、解...
Eigen是一个开源的C++矩阵和向量库,它专注于高效、灵活和易于使用。这个库被广泛应用于数值计算、机器学习、计算机视觉等多个领域。本教程将帮助你理解并掌握如何利用Eigen进行矩阵运算和线性代数操作。 ## 1. ...
今天,我们将重点介绍Eigen库在计算矩阵特征值及特征向量方面的应用。 什么是矩阵特征值和特征向量 在线性代数中,矩阵的特征值和特征向量是矩阵的两个重要特征。特征值是矩阵的一种 scalar,满足特征方程式 Ax = ...
**Eigen库** Eigen是一个开源的C++库,专门用于处理线性代数问题。它提供了高效、简洁且灵活的接口,使得在C++程序中进行矩阵运算和向量操作变得非常简便。Eigen库的设计目标是速度和易用性,它支持多种数据类型,...
Eigen库是这个领域的关键组件,它提供了与MATLAB相似的功能,使得开发人员能够在桌面应用程序中执行复杂的数值计算,特别是在信号处理、图像分析、机器学习等领域。以下将详细介绍Eigen库中的特征值分解(eig)、...
### C++ Eigen库和Dlib库使用指南 #### 一、引言 随着现代软件开发对性能需求的不断提高,特定领域的高效库变得越来越重要。在众多高性能库中,Eigen和Dlib是两个非常值得关注的选择。Eigen专注于线性代数运算,而...
在C++中,我们可以使用Eigen库的`Eigen::EigenSolver<MatrixXf>`类,如下: ```cpp Eigen::MatrixXf A = ...; // 初始化矩阵A Eigen::EigenSolver<Eigen::MatrixXf> es(A); std::vector<std::complex<double>> ...
在实际项目中,Eigen3常与其他C++库如OpenCV(计算机视觉库)和NumPy(Python科学计算库)一起使用,以构建高性能的算法。由于其接口简洁,学习曲线相对平缓,对于C++开发者来说,Eigen是进行矩阵计算的理想选择。 ...
Eigen 3 是一个开源的C++数学库,主要用于线性代数操作,包括向量、矩阵以及相关的运算。它在TensorFlow这样的深度学习框架中扮演着核心角色,因为高效的矩阵运算对于训练神经网络至关重要。Eigen库的设计简洁且高效...
EIGEN是一个开源的C++库,专门用于线性代数、矩阵和向量运算,以及相关的数值算法。它提供了一种高效、灵活且易于使用的接口,使得在C++项目中进行复杂的数学运算变得简单。EIGEN安装包是开发者在Visual Studio或...
### Eigen库最新稳定版3.3.9知识点详解 #### 一、Eigen库简介 Eigen是一个全面的C++模板库,用于线性代数运算,包括矩阵和向量运算等。它支持各种矩阵和数组类型,以及广泛的线性代数运算,如矩阵乘法、求逆、特征...
《C++中的Eigen库:矩阵操作与特征值分解详解》 在C++编程语言中,高效处理矩阵运算是一项重要的任务,特别是在科学计算、数据分析和机器学习等...对于那些处理大量矩阵计算的项目来说,Eigen库是一个不可或缺的资源。
**Eigen 矩阵运算库文档手册** Eigen 是一个开源的 C++ 库,专门用于高效、简洁地处理线性代数问题,包括向量、矩阵以及更复杂的运算。它被广泛应用于计算机图形学、机器学习、物理模拟等多个领域。Eigen 的设计...
首先,我们需要确保Eigen3库已经正确安装在系统中。Eigen3通常不需要编译,因为它是头文件库,可以直接在项目中包含所需的头文件。你可以通过在项目中引用Eigen3的主头文件`<Eigen/Dense>`或`<Eigen/Core>`来测试...
Eigen是一个在C++编程语言中广泛使用的开源矩阵和向量操作库,专注于高效、简洁的线性代数运算。这个库被设计为高度优化,能够充分利用现代CPU的特性,如SIMD(单指令多数据)指令,以及在多核处理器上的并行计算。...