Eigen 矩陣運算庫在實際項目中的使用情況如何?
01-08
心血來潮,試了試純模板技術寫的 Eigen 並作了簡單的性能測試,三個 1000 階的方陣連乘運算 Eigen 比 MATLAB 快了一倍,比 OpenCV 快了 2 倍,但是這個庫在實際項目中的穩定性和速度如何我還不大清楚,故有此問。
另外,目前流行的 C++ 數值計算庫很多都使用了 expression template 技術來抑制臨時對象的生成,極大提高了運算性能,但對於同樣使用這個技術的不同的庫,速度卻相差很大,例如 Armadillo,雖然它的底層採用了 BLAS 和 LAPACK,但在上述運算中比 Eigen 慢了整整 4 倍。產生這種現象的原因是什麼?
總體來說還是Armadillo快些,需要自己設置一下,方法的網上有教程。
下面是Eigen的項目:
Projects using Eigen
Extensions, numerical computation and bindings
- Google"s Ceres solver is a portable C++ library that allows for modeling and solving large complicated nonlinear least squares problems.
- The Manifold ToolKit MTK provides easy mechanisms to enable arbitrary algorithms to operate on manifolds. It also provides a Sparse Least Squares Solver (SLoM) and an Unscented Kalman Filter (UKFoM).
- minieigen is small boost::python wrapper for Eigen"s core classes (dense fixed and dynamic-sized vectors, matrices, aligned boxes, quaternions; with integer, floating and complex scalars) including operators and subset of Eigen"s API methods.
- redsvd is a RandomizED Singular Value Decomposition library for sparse or very large dense matrices.
- The RcppEigen package provides bindings and more for R.
- trustOptim is a trust-region based non linear solver supporting sparse Hessians (C++ implementation with R binding).
- sparray: a python binding of the Sparse module - alpha stage.
- Shogun: a large scale machine learning toolbox.
- Stan: a statistical package based on Eigen that includes a reverse-mode automatic differentiation implementation.
- jeigen, a Java wrapper for Eigen.
Science
- The Large Survey Synoptic Telescope (website; trac) is a project to build a 3.2Mpixel camera on an 8.4m telescope and survey the entire visible sky every three days.
- Gnu Data Language, a GPL interpretor of IDL syntax codes.
- The Space Trajectory Analysis project at the European Space Agency. They even have an announcement on using Eigen.
- Avogadro, an opensource advanced molecular editor.
- The 3D astronomical visualization application Celestia is now using Eigen for all orbital and geometric calculation.
- Yade, platform for dynamic particle models, uses Eigen for geometric computations (switched from the WildMagic package)
- SLangTNG, an application suite for numerical analysis, linear algebra, advanced statistics, FEM, structural dynamics, data visualization, etc.
- Clip, an opensource program for the orientation of Laue exposures.
- Multiprecision Computing Toolbox for MATLAB uses Eigen as core library for matrix computations.
- Pteros, a C++ library for molecular modeling.
- Cufflinks, a tool for transcript assembly, differential expression, and differential regulation for RNA-Sequences.
- Vortexje: a GPL library for simulation implementing the source-doublet panel method.
- Woo(dem), particle dynamics software (DEM, FEM); Eigen wrapped using minieigen in Python.
Robotics and engineering
- The Yujin Robot company uses Eigen for the navigation and arm control of their next gen robots. (switched from blitz, ublas and tvmet)
- The Robotic Operating System (ROS) developed by Willow Garage.
- openAHRS Open Source IMU / AHRS
- The Darmstadt Dribblers autonomous Humanoid Robot Soccer Team and Darmstadt Rescue Robot Team use Eigen for navigation and world modeling.
- The Mobile Robot Programming Toolkit (MRPT), a set of libraries for SLAM, localization and computer vision, moved to Eigen (blogannouncement) (switched from home made math classes).
- RBDL: a C++ library for rigid body dynamics.
- RL a self-contained C++ library for robot kinematics, motion planning and control.
- BTK is a Biomechanical ToolKit, licensed under BSD whose primary goal is to propose a set of tools for the analysis of the human body motion which is independent of any acquisition system. It proposes bindings for Matlab/Octave and Python, and a GUI software called Mokka to visualize/analyze 3D/2D motion capture data.
- libpointmatcher is a "Iterative Closest Point" library for 3D mapping in robotics.
Computer Graphics
- Computational Geometry Algorithms Library (CGAL), a collaborative effort to develop a robust, easy to use, and efficient C++ software library of geometric data structures and algorithms.
- Point Cloud Library (PCL), a large scale, BSD licensed, open project for point cloud processing. Uses Eigen as their math backend.
- VcgLib, an opensource C++ template library for the manipulation and processing of triangle and tetrahedral meshes. (switched from home made math classes)
- MeshLab, an opensource software for the processing and editing of unstructured 3D triangular meshes and point cloud. (switched from vcglib"s math classes)
- Expe, an experimental framework for the rapid prototyping of graphics applications. No release yet, but it uses 90% of Eigen"s features. (switched from home made math classes).
- libmv, an opensource structure from motion library. (switched from FLENS)
- openMVG a simple library for multiple view geometry.
- Google uses Eigen for machine learning, computer vision, and optimization.
- In particular, see the mention of Ceres above.
Mobile apps
- Layar, an augmented reality appplication for IPhone and Android.
- Red Sword Studios, maker of the iPhone games Gradient, Fortress Luna, Stimulus, and Lustre, uses Eigen extensively. Why roll your own matrix/vector/transformation code when there"s Eigen?
- iPerfectPutt, an iPhone game, uses Eigen for 3D geometry calculations.
KDE (our origins!)
- Step, an educational physics simulator.
- Koffice2 (KDE"s office suite), in particular Krita, the painting and image editing module. Eigen is also used a bit by KSpread, the spreadsheet module, for matrix functions such as MINVERSE, MMULT, MDETERM.
- Kalzium uses Eigen indirectly through the aforementioned Avogadro library.
- the Mandelbrot wallpaper plugin, some screensavers, kgllib, solidkreator, etc.
Others
- WhirlyGlobe a 3D globe component.
同志,你確定純用Eigen比MATLAB會快?我想知道你是怎麼設置的?我用Eigen+Intel MKL在Release x64模式下也只是跟MATLAB運算速度差不多而已Visual Studio下實現Eigen+Intel MKL的矩陣乘法
顯然openblas比matlab的mkl快。要速度的話,GPU加速吧,至少快5倍。
Benchmark - Eigen圖中可以看到Eigen和主流的MKL不相上下,實際使用中也有類似的體驗。值得注意的是Eigen的稀疏矩陣處理非常優秀,Armadillo之流無法與之相比。查看Libmesh才發現,其中也用到了Eigen,在Eigen頁面里沒有提到。LZ提到比Armadillo快了4倍,我覺得是可能的,Armadillo只是個和matlab長得像的殼子,具體計算還是調用Blas庫來進行運算的,在優化層次上比不上Eigen
我依稀記得OpenCV底層支持Eigen,OpenCV在機器視覺領域是王者之一,Eigen的影響力可見一斑。我在自己的項目大量使用Eigen來做數值計算,我覺得Eigen就是方便好用,速度瓶頸主要在演算法而不是底層庫。
如果代碼基本一樣,eigen比arm快,看看底層是具體用的哪個庫做運算,還有編譯選項也很重要,template在-o2和-o0上會完全是兩個速度
Armadillo+Openblas的組合更快,而且Armadillo的函數更接近Matlab
有沒有遇到過這種情況,在用eigen庫的時候用比較大的維數矩陣運算的時候,會出現這樣的錯誤
推薦閱讀:
※用matlab繪製電場線和等勢面如何做?
※加速度如何在頻域上積分成位移?
※如何畫出兩個隱函數曲面的交線?
※為什麼 MATLAB 矩陣為縱向存儲,有什麼好處?
※常見的MATLAB初學者問題中,哪些讓你非常無語或者覺得值得吐槽?