Eigen is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms.
Eigen 3.3-rc1 released! (22.09.2016)
Eigen 3.3-rc1 has been released on September 22, 2016.
If everything goes well, this release candidate should be last milestone before we release Eigen 3.3 next week.
The source archive is at: http://bitbucket.org/eigen/eigen/get/3.3-rc1.tar.bz2
Since 3.3-beta2, this release introduces a few new features including eigenvectors in GeneralizedEigenSolver, SparseMatrix::coeffs(), improved supports for custom nullary functors and custom complex types. This release also contains numerous fixes of all kinds and some documentation improvements.Complete changelog.
Eigen3.3-beta2 released! (26.07.2016)
Eigen 3.3-beta2 has been released on July 26, 2016.
The source archive is at: http://bitbucket.org/eigen/eigen/get/3.3-beta2.tar.bz2
Since the previous 3.3-beta1 release, this beta version received more than 1000 commits including numerous fixes, some performance and numerical robustness improvements, as well as some key novel features such as the new CompleteOrthogonalDecomposition class for fast minimal norm solving, fast reciprocal condition number estimators in LU and Cholesky factorizations, support for inplace decompositions, unaligned vectorization, support for the new ZVector SIMD engine, support for any BLAS/LAPACK libraries as backend, improved support for mixing scalar types, and more.
The new performance comparison table of dense solvers might also be of particular interest to help you picking the right solver.
If you missed the major novelties introduced in the 3.3-alpha1 and 3.3-beta1 releases, check the page dedicated to the 3.3 release for a comprehensive review of all the novelties and improvements introduced in the 3.3 branch.
As for any beta release, everybody is highly encouraged to test this release on their own code and report any compilation issues or performance regressions on the bugtracker.Complete changelog since 3.3-beta1.
Eigen 3.2.9 released! (18.07.2016)
Eigen 3.2.9 has been released on July 18, 2016.
This is a maintenance release with few bug fixes and backports since the release of 3.2.8 five months ago. For more details, look at the Changelog.The source archive is at http://bitbucket.org/eigen/eigen/get/3.2.9.tar.bz2 .
Eigen 3.2.8 released! (16.02.2016)
Eigen 3.2.8 has been released on February 16, 2016.
This is a maintenance release with few bug fixes and backports since the release of 3.2.7 three months ago. For more details, look at the Changelog.The source archive is at http://bitbucket.org/eigen/eigen/get/3.2.8.tar.bz2 .
Eigen3.3-beta1 released! (16.12.2015)
Eigen 3.3-beta1 has been released on December 16, 2015.
The source archive is at: http://bitbucket.org/eigen/eigen/get/3.3-beta1.tar.bz2
Since the previous 3.3-alpha1 release, this beta version introduces several fixes, as well as some novel features such as new array functions (rsqrt, sign, lgamma, erf, erfc), row/column-wise lpNorm, LU::transpose()/adjoint() API, support for matrix-free iterative solvers, improved sparse matrix filling and products, and more.
If you missed the major novelties introduced in the 3.3-alpha1 version, here is a brief summary of the most exciting ones: novel expression template engine, fast divide and conquer SVD, support for AVX and VSX vector instructions, more OpenMP parallelism, a LS-CG solver.
Check the page dedicated to the 3.3 release for a comprehensive review of all the novelties and improvements introduced in the 3.3 branch.
As for any beta release, everybody is highly encouraged to test this release on their own basecode and report any compilation issue or performance regression on the bugtracker.Complete changelog since 3.3-alpha1.
To check out the Eigen repository using Mercurial, also known as "hg", do:
hg clone https://bitbucket.org/eigen/eigen/
- Eigen is versatile.
- It supports all matrix sizes, from small fixed-size matrices to arbitrarily large dense matrices, and even sparse matrices.
- It supports all standard numeric types, including std::complex, integers, and is easily extensible to custom numeric types.
- It supports various matrix decompositions and geometry features.
- Its ecosystem of unsupported modules provides many specialized features such as non-linear optimization, matrix functions, a polynomial solver, FFT, and much more.
- Eigen is fast.
- Expression templates allow to intelligently remove temporaries and enable lazy evaluation, when that is appropriate.
- Explicit vectorization is performed for SSE 2/3/4, ARM NEON, and AltiVec instruction sets, with graceful fallback to non-vectorized code.
- Fixed-size matrices are fully optimized: dynamic memory allocation is avoided, and the loops are unrolled when that makes sense.
- For large matrices, special attention is paid to cache-friendliness.
- Eigen is reliable.
- Eigen is elegant.
- The API is extremely clean and expressive while feeling natural to C++ programmers, thanks to expression templates.
- Implementing an algorithm on top of Eigen feels like just copying pseudocode.
- Eigen has good compiler support as we run our test suite against many compilers to guarantee reliability and work around any compiler bugs. Eigen also is standard C++98 and maintains very reasonable compilation times.
- Eigen 3 documentation: this includes a getting started guide, a long tutorial, a quick reference, and page about porting from Eigen 2 to Eigen 3.
Eigen doesn't have any dependencies other than the C++ standard library.
We use the CMake build system, but only to build the documentation and unit-tests, and to automate installation. If you just want to use Eigen, you can use the header files right away. There is no binary library to link to, and no configured header file. Eigen is a pure template library defined in the headers.
Eigen is Free Software. It is licensed under the LGPL3+. As an alternative license choice, Eigen is also licensed under the GPL2+.
Virtually any software may use Eigen. For example, closed-source software may use Eigen without having to disclose its own source code. Many proprietary and closed-source software projects are using Eigen right now, as well as many BSD-licensed projects.
Eigen is standard C++98 and so should theoretically be compatible with any compliant compiler. Whenever we use some non-standard feature, that is optional and can be disabled.
Eigen is being successfully used with the following compilers:
- GCC, version 3.4 and newer. Very good performance with GCC 4.2 and newer.
- MSVC (Visual Studio), 2005 and newer. Vectorization is enabled with 2008 and newer, which also gives good performance.
- Intel C++ compiler. Very good performance.
- LLVM/CLang++ (2.8 and newer).
- MinGW, recent versions. Very good performance when using GCC 4.
- QNX's QCC compiler.
Projects using Eigen
- 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.
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 (blog announcement) (switched from home made math classes).
- 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)
- Google uses Eigen for machine learning, computer vision, and optimization.
- 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?
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.
If you are aware of some interesting projects using Eigen, please send us a message or directly edit this wiki page !
Need help using Eigen? Try this:
- The Users Forum is your best resource.
- You can always try our IRC channel.
- Want to discuss something with the developers? Use our mailing list.
- To subscribe, send a mail with subject subscribe to firstname.lastname@example.org
- To unsubscribe, send a mail with subject unsubscribe to email@example.com
The Eigen mailing list can be used for discussing general Eigen development topics. Notice that:
- End-user questions are better asked on the Users Forum.
- Development of specific features is best tracked and discussed on our Bugzilla. See this page.
This mailing list is public and has public archives.
Important: You must subscribe before you may post. Sorry, this is our only way to prevent spam.
Important: After you sent your subscription request, you will receive a confirmation e-mail. Check your spam folder, as these confirmation e-mails are often filtered as spam!
Core Team Mailing list
This private mailing list should only be used for matters that need to be discussed privately. It is read by Benoît and Gaël.
Its address is eigen-core-team at the same lists server as for the Eigen mailing list.
No need to subscribe (actually, subscription is closed).
The point of the eigen-core-team list is that sometimes, people want to write privately to a few core developers. This list provides a simple way of doing so.
Our IRC channel is #eigen on irc.freenode.net.
Everybody's welcome to discuss Eigen-related topics or just chat. Some quick Eigen development chat happens over IRC, but the main place for Eigen development discussion remains the Eigen mailing list. Some user support also happens over IRC, but the main place for Eigen user support is the Users Forum.
The Eigen project was started by Benoît Jacob (founder) and Gaël Guennebaud (guru). Many other people have since contributed their talents to help make Eigen successful. Here's an alphabetical list: (note to contributors: do add yourself!)
|Abraham Bachrach||Added functions for cwise min/max with a scalar|
|Carlos Becker||Wrote some of the pages of the tutorial|
|David Benjamin||Artwork: the owls|
|Cyrille Berger||Fix error in logic of installation script|
|Armin Berres||Lots of fixes (compilation warnings and errors)|
|Jose Luis Blanco||Build fixes for MSVC and AMD64, correction in docs|
|Mark Borgerding||FFT module|
|Romain Bossart||Updates to Sparse solvers|
|Kolja Brix||Added documentation to Householder module|
|Thomas Capricelli||Migration to mercurial, Non-linear optimization and numerical differentiation, cron-job to update the online dox|
|Andrew Coles||Fixes (including a compilation error)|
|Marton Danoczy||MSVC compilation fix, support for ARM NEON with Clang 3.0 and LLVM-GCC|
|Christian Ehrlicher||MSVC compilation fix|
|Daniel Gomez Ferro||Improvements in Sparse and in matrix product|
|Rohit Garg||Vectorized quaternion and cross products, improved integer product|
|Mathieu Gautier||QuaternionMap and related improvements|
|Anton Gladky||Visual Studio 2008 and GCC 4.6 compilation fixes|
|Stuart Glaser||Prevent allocations in LU decomposition|
|Marc Glisse||C++11 compilation issues (suffices for literals)|
|Frederic Gosselin||Improve filter for hidden files in CMake|
|Gaël Guennebaud||Core developer|
|Philippe Hamelin||Allow CMake project to be included in another project|
|Marcus D. Hanwell||CMake improvements. Marcus is a developer at Kitware!|
|Chen-Pang He||Extend matrix functions to accept more types|
|Hauke Heibel||Lots of increasingly 'core' things|
|Christoph Hertzberg||Quaternions (vectorized multiplication, unaligned)|
|Pavel Holoborodko||Multi-precision support with MPFR C++|
|Tim Holy||Improvements to tutorial, LDLT update and downdate|
|Intel||Back-end to Intel Math Kernel Library (MKL)|
|Trevor Irons||Square root for complex numbers, fix compile errors and mistake in docs|
|Benoît Jacob||Core developer|
|Bram de Jong||Improvement to benchmark suite|
|Kibeom Kim||Implement *= /= * / operations for VectorwiseOp|
|Claas Köhler||Improvements to FFTW CMake module|
|Igor Krivenko||Properly cast constants when using non-standard scalars|
|Marijn Kruisselbrink||CMake fixes|
|Moritz Lenz||Allow solving transposed problem with SuperLU|
|Sebastian Lipponer||MSVC compilation support|
|Daniel Lowenberg||Add SparseView class|
|David J. Luitz||Bug fix for sparse * dense matrix product|
|D J Marcin||Fix operator& precedence bug|
|Konstantinos A. Margaritis||AltiVec and ARM NEON vectorization|
|Ricard Marxer||Reverse, redux improvements, the count() method, some dox|
|Vincenzo Di Massa||CMake fix|
|Christian Mayer||Early code review and input in technical/design discussions|
|Frank Meier-Dörnberg||MSVC compatibility fixes|
|Keir Mierle||LDLT decomposition and other improvements|
|Laurent Montel||CMake improvements. Laurent is (with Alexander) one of the CMake gurus at KDE!|
|Eamon Nerbonne||Compilation fixes for win32|
|Alexander Neundorf||CMake improvements. Alexander is (with Laurent) one of the CMake gurus at KDE!|
|Jason Newton||Componentwise tangent functions|
|Jitse Niesen||Matrix functions, large improvements in the Eigenvalues module and in the docs|
|Desire Nuentsa||Many improvements to Sparse module: ILUT, PaStiX|
|Jan Oberländer||Compatibility with termios.h|
|Jos van den Oever||Compilation fix|
|Michael Olbrich||Early patches, including the initial loop meta-unroller|
|Bjorn Piltz||Visual C compilation fix|
|Zach Ploskey||Copy-editing of tutorial|
|Manoj Rajagopalan||Introduce middleRows() / middleCols(), bug fix for nonstandard numeric types|
|Stjepan Rajko||MSVC compatibility fix|
|Jure Repinc||CMake fixes|
|Kenneth Frank Riddile||Lots of Windows/MSVC compatibility fixes, handling of alignment issues|
|Adolfo Rodriguez||Prevent allocations in matrix decompositions|
|Peter Román||Support for SuperLU's ILU factorization|
|Oliver Ruepp||Bug fix in sparse matrix product with row-major matrices|
|Radu Bogdan Rusu||Fix compilation warning|
|Guillaume Saupin||Skyline matrices|
|Jakob Schwendner||Test for unaligned quaternions|
|Martin Senst||Bug fix for empty matrices|
|Benjamin Schindler||gdb pretty printers|
|Michael Schmidt||Compilation fix connected to min/max|
|Dennis Schridde||New typedefs like AlignedBox3f|
|Sameer Sheorey||Fix gdb pretty printer for variable-size matrices|
|Andy Somerville||Functions to get intersection between two ParametrizedLines|
|Alex Stapleton||Help with tough C++ questions|
|Adam Szalkowski||Bug fix in MatrixBase::makeHouseholder()|
|Adolfo Rodriguez Tsourouksdissian||Version of JacobiSVD that pre-allocates its resources|
|Piotr Trojanek||QCC compilation fixes|
|Anthony Truchet||Bugfix in QTransform and QMatrix support|
|James Richard Tyrer||CMake fix|
|Rhys Ulerich||Pkg-config support, improved GDB pretty-printer|
|Ingmar Vanhassel||CMake fix|
|Scott Wheeler||Documentation improvements|
|Urs Wolfer||Fixed a serious warning|
|Manuel Yguel||Bug fixes, work on inverse-with-check, the Polynomial module|
Eigen is also using code that we copied from other sources. They are acknowledged in our sources and in the Mercurial history, but let's also mention them here:
|Intel Corporation||SSE code for 4x4 matrix inversion taken from here.|
|Julien Pommier||SSE implementation of exp,log,cos,sin math functions from GMM++|
|Minpack authors||Algorithms for non linear optimization.|
Special thanks to Tuxfamily for the wonderful quality of their services, and the GCC Compile Farm Project that gives us access to many various systems including ARM NEON.
If you are looking for a BibTeX entry to use to cite Eigen in academic papers, see the BibTeX page.