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

* Versatile. (See modules and tutorial). Eigen handles, without code
  duplication, and in a completely integrated way:

  o both fixed-size and dynamic-size matrices and vectors.
  o both dense and sparse (the latter is still experimental) matrices
  and vectors.   
  o both plain matrices/vectors and abstract expressions.
  o both column-major (the default) and row-major matrix storage.
  o both basic matrix/vector manipulation and many more advanced,
    specialized modules providing algorithms for linear algebra,
    geometry, quaternions, or advanced array manipulation. 
  o various numeric types out of the box, including std::complex
    numbers, while being easy to extend to custom numeric types.  

* Fast. (See benchmark).
  o Expression templates allow to intelligently remove temporaries and
    enable lazy evaluation, when that is appropriate -- Eigen takes care
    of this automatically and handles aliasing too in most cases. 
  o Explicit vectorization is performed for the SSE (2 and later),
    AltiVec and ARM NEON (in the development branch for now) instruction
    sets, with graceful fallback to non-vectorized code. Expression
    templates allow to perform these optimizations globally for whole
    expressions. 
  o With fixed-size objects, dynamic memory allocation is avoided, and
    the loops are unrolled when that makes sense. 
  o For large matrices, special attention is paid to cache-friendliness. 

* Elegant. (See API showcase). The API is extremely clean and
  expressive, thanks to expression templates. Implementing an
  algorithm on top of Eigen feels like just copying pseudocode. You
  can use complex expressions and still rely on Eigen to produce
  optimized code: there is no need for you to manually decompose
  expressions into small steps. 

* Compiler-friendy. Eigen has very reasonable compilation times at
  least with GCC, compared to other C++ libraries based on expression
  templates and heavy metaprogramming. Eigen is also standard C++ and
  supports various compilers.  

Homepage:
http://eigen.tuxfamily.org/
