Main Page

From Eigen
Revision as of 14:27, 22 July 2012 by Bjacob (Talk | contribs)

Jump to: navigation, search

Eigen is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms.


Announcements

Eigen 3.4.0 released! (18.08.2021) doc

Eigen 3.4-rc1 released! (19.04.2021) doc

Eigen 3.3.9 released! (04.12.2020) doc

Eigen on Discord (16.11.2020) doc

Eigen 3.3.8 released! (05.10.2020) doc

Get it

The latest stable release is Eigen 3.1.0. Get it here: tar.bz2, tar.gz, zip. Changelog.

The latest 3.0 series release is Eigen 3.0.6. Get it here: tar.bz2, tar.gz, zip. Changelog.

The old 2.0 series release is Eigen 2.0.17. Get it here: tar.bz2, tar.gz, zip. Changelog.


The unstable source code from the development branch is there: tar.bz2, tar.gz, zip.

To check out the Eigen repository using Mercurial, also known as "hg", do:

hg clone https://bitbucket.org/eigen/eigen/

[ other downloads ] [ browse the source code ]


Overview

  • 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.
    • Algorithms are carefully selected for reliability. Reliability trade-offs are clearly documented and extremely safe decompositions are available.
    • Eigen is thoroughly tested through its own test suite (over 500 executables), the standard BLAS test suite, and parts of the LAPACK test suite.
  • 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.

Documentation

Requirements

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.

License

Eigen is Free Software. Starting from the 3.1.1 version, it is licensed under the MPL2, which is a simple weak copyleft license. Common questions about the MPL2 are answered in the official MPL2 FAQ.

Earlier versions were licensed under the LGPL3+.

Note that currently, a few features rely on third-party code licensed under the LGPL: SimplicialCholesky, AMD ordering, and constrained_cg. Such features can be explicitly disabled by compiling with the EIGEN_MPL2_ONLY preprocessor symbol defined.

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.

See the MPL2 FAQ for more information, and do not hesitate to contact us if you have any questions.

Compiler support

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 4.1 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

Extensions, numerical computation and bindings

  • The 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).
  • redsvd is a RandomizED Singular Value Decomposition library for sparse or very large dense matrices.
  • The RcppEigen package provides bindings and more for R.
  • sparray: a python binding of the Sparse module - alpha stage.
  • Shogun: a large scale machine learning toolbox.

Science

  • 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.

Robotics and engineering

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)

Google

  • Google uses Eigen for machine learning, computer vision, and optimization.

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.

If you are aware of some interesting projects using Eigen, please send us a message or directly edit this wiki page !

Get support

Need help using Eigen? Try this:

Bug reports

For bug reports and feature requests, please use the issue tracker. To file a new bug, go there. See this page for some instructions.

Mailing list

Address: eigen@lists.tuxfamily.org

  • To subscribe, send a mail with subject subscribe to eigen-request@lists.tuxfamily.org
  • To unsubscribe, send a mail with subject unsubscribe to eigen-request@lists.tuxfamily.org

The Eigen mailing list can be used for discussing general Eigen development topics. Notice that:

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).

For all Eigen development discussion, use the public Eigen mailing list or Bugzilla instead.

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.

IRC Channel

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.

Credits

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 Extended matrix functions, STL compatibility, Splines, CMake improvements, and more ...
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.
Tim Davis AMD reordering simplicial sparse Cholesky factorization adapted from SuiteSparse
Julien Pommier SSE implementation of exp,log,cos,sin math functions from GMM++
Yousef Saad IncompleteLUT preconditioner coming from ITSOL
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.