See the full lists of [addressed bugs](https://gitlab.com/libeigen/eigen/-/issues?state=all&label_name%5B%5D=release%3A%3A5.0.1) and [merge requests](https://gitlab.com/libeigen/eigen/-/merge_requests?state=all&label_name%5B%5D=release%3A%3A5.0.1) for more details.
Eigen 5.0 provides many new features, performance enhancements, and bugfixes throughout Eigen’s core template expression infrastructure and linear algebra facilities. The full set of changes and related issues are too large to list here, but can be accessed via the release milestone %"5.0".
This is the last major release to support the C++14 language standard. The master branch and subsequent releases will require support for C++17.
### Versioning
This release marks a transition to [Semantic Versioning](https://semver.org/). Previously, Eigen used a WORLD.MAJOR.MINOR scheme. From now on, version numbers will follow the MAJOR.MINOR.PATCH format, indicating breaking changes, new features, and bug fixes, respectively. The WORLD version will remain 3 for this and subsequent releases for posterity. See the table below:
```
╔═════════╦═════╦═════╗
║ Release ║ 3.4 ║ 5.0 ║
╠═════════╬═════╬═════╣
║ WORLD ║ 3 ║ 3 ║
║ MAJOR ║ 4 ║ 5 ║
║ MINOR ║ 0 ║ 0 ║
║ PATCH ║ - ║ 0 ║
╚═════════╩═════╩═════╝
```
### Breaking changes
* Eigen 5.X.X requires C++14. When building with GNU-compatible compilers, set `-std=c++14` or later. As part of this change, some macros such as `EIGEN_HAS_CXX11` have also been removed.
* The CMake build system has been modernized and older properties have been removed - projects relying on CMake may need to update their configurations [!485].
* All LGPL-licensed code has been removed (i.e. Constrained Conjugate Gradient) [!1197]. These were "unsupported" anyways, and weren't widely used.
* Due to name conflicts with other projects, `Eigen::all` and `Eigen::last` have been moved to `Eigen::placeholders::all` and `Eigen::placeholders::last` [!649].
* Any direct inclusion of an internal header (i.e. under a `../src/..` path) will result in a compilation error [!631].
* Runtime SVD options for computing thin/full U/V have been deprecated: use compile-time options instead [!826].
* Scalar (i.e. non-vectorized) comparisons now return masks with values of `Scalar(1)` rather than having all bits set to avoid undefined behavior [!1862].
* BLAS return types have been changed for Eigen BLAS to `void` instead of `int` for compatibility with other BLAS implementations [!1497].
*`Eigen::aligned_allocator` no longer inherits from `std::allocator` due to a change in the standard and the use of `allocate_at_least` [!1795].
* Euler angles are now returned in a more canonical form, potentially resulting in a change of behavior [!1301, !1314].
* Eigen's random number generation has changed, resulting in a change of behavior. Please do not rely on specific random numbers from Eigen - these were never guaranteed to be consistent across Eigen versions, nor are they generally consistent across platforms [!1437].
**Notice:** 3.4.x will be the last major release series of Eigen that will support c++03.
### Breaking changes
* Using float or double for indexing matrices, vectors and arrays will now fail to compile
* **Behavioral change:** `Transform::computeRotationScaling()` and `Transform::computeScalingRotation()` are now more continuous across degeneracies (see !349).
### New features
* Add c++11 **`initializer_list` constructors** to Matrix and Array [\[doc\]](http://eigen.tuxfamily.org/dox-devel/group__TutorialMatrixClass.html#title3)
* Add STL-compatible **iterators** for dense expressions [\[doc\]](http://eigen.tuxfamily.org/dox-devel/group__TutorialSTL.html).
* New versatile API for sub-matrices, **slices**, and **indexed views** [\[doc\]](http://eigen.tuxfamily.org/dox-devel/group__TutorialSlicingIndexing.html).
* Add C++11 **template aliases** for Matrix, Vector, and Array of common sizes, including generic `Vector<Type,Size>` and `RowVector<Type,Size>` aliases [\[doc\]](http://eigen.tuxfamily.org/dox-devel/group__matrixtypedefs.html).
* New support for `bfloat16`.
### New backends
* **Arm SVE:** fixed-length [Scalable Vector Extensions](https://developer.arm.com/Architectures/Scalable%20Vector%20Extensions) vectors for `uint32_t` and `float` are available.
* **AMD ROCm/HIP:** generic GPU backend that unifies support for [NVIDIA/CUDA](https://developer.nvidia.com/cuda-toolkit) and [AMD/HIP](https://rocmdocs.amd.com/en/latest/).
* **Power 10 MMA:** initial support for [Power 10 matrix multiplication assist instructions](https://arxiv.org/pdf/2104.03142.pdf) for float32 and float64, real and complex.
### Improvements
* Eigen now uses the c++11 **alignas** keyword for static alignment. Users targeting C++17 only and recent compilers (e.g., GCC>=7, clang>=5, MSVC>=19.12) will thus be able to completely forget about all [issues](http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html) related to static alignment, including `EIGEN_MAKE_ALIGNED_OPERATOR_NEW`.
* Various performance improvements for products and Eigen's GEBP and GEMV kernels have been implemented:
* By using half and quater-packets the performance of matrix multiplications of small to medium sized matrices has been improved
* Eigen's GEMM now falls back to GEMV if it detects that a matrix is a run-time vector
* The performance of matrix products using Arm Neon has been drastically improved (up to 20%)
* Performance of many special cases of matrix products has been improved
* Large speed up from blocked algorithm for `transposeInPlace`.
* Speed up misc. operations by propagating compile-time sizes (col/row-wise reverse, PartialPivLU, and others)
* Faster specialized SIMD kernels for small fixed-size inverse, LU decomposition, and determinant.
* Improved or added vectorization of partial or slice reductions along the outer-dimension, for instance: `colmajor_mat.rowwise().mean()`.
### Elementwise math functions
* Many functions are now implemented and vectorized in generic (backend-agnostic) form.
* Many improvements to correctness, accuracy, and compatibility with c++ standard library.
* Much improved implementation of `ldexp`.
* Misc. fixes for corner cases, NaN/Inf inputs and singular points of many functions.
* New implementation of the Payne-Hanek for argument reduction algorithm for `sin` and `cos` with huge arguments.
* New faithfully rounded algorithm for `pow(x,y)`.
* Speedups from (new or improved) vectorized versions of `pow`, `log`, `sin`, `cos`, `arg`, `pow`, `log2`, complex `sqrt`, `erf`, `expm1`, `logp1`, `logistic`, `rint`, `gamma` and `bessel` functions, and more.
* Improved special function support (Bessel and gamma functions, `ndtri`, `erfc`, inverse hyperbolic functions and more)
* New elementwise functions for `absolute_difference`, `rint`.
### Dense matrix decompositions and solvers
* All dense linear solvers (i.e., Cholesky, *LU, *QR, CompleteOrthogonalDecomposition, *SVD) now inherit SolverBase and thus support `.transpose()`, `.adjoint()` and `.solve()` APIs.
* SVD implementations now have an `info()` method for checking convergence.
* Most decompositions now fail quickly when invalid inputs are detected.
* Optimized the product of a `HouseholderSequence` with the identity, as well as the evaluation of a `HouseholderSequence` to a dense matrix using faster blocked product.
* Fixed aliasing issues with in-place small matrix inversions.
* Fixed several edge-cases with empty or zero inputs.
### Sparse matrix support, decompositions and solvers
* Enabled assignment and addition with diagonal matrix expressions.
* Support added for SuiteSparse KLU routines via the `KLUSupport` module. SuiteSparse must be installed to use this module.
*`SparseCholesky` now works with row-major matrices.
* Various bug fixes and performance improvements.
### Type support
* Improved support for `half`
* Native support added for ARM `__fp16`, CUDA/HIP `__half`, and `F16C` conversion intrinsics.
* Better vectorization support added across all backends.
* Improved bool support
* Partial vectorization support added for boolean operations.
* Significantly improved performance (x25) for logical operations with `Matrix` or `Tensor` of `bool`.
* Improved support for custom types
* More custom types work out-of-the-box (see #2201).
### Backend-specific improvements
* **Arm NEON**
* Now provides vectorization for `uint64_t`, `int64_t`, `uint32_t`, `int16_t`, `uint16_t`, `int16_t`, `int8_t`, and `uint8_t`
* Emulates `bfloat16` support when using `Eigen::bfloat16`
* Supports emulated and native `float16` when using `Eigen::half`
* **SSE/AVX/AVX512**
* General performance improvements and bugfixes.
* Enabled AVX512 instructions by default if available.
* New `std::complex`, `half`, and `bfloat16` vectorization support added.
* Many missing packet functions added.
* **Altivec/Power**
* General performance improvement and bugfixes.
* Enhanced vectorization of real and complex scalars.
* Changes to the `gebp_kernel` specific to Altivec, using VSX implementation of the MMA instructions that gain speed improvements up to 4x for matrix-matrix products.
* Dynamic dispatch for GCC greater than 10 enabling selection of MMA or VSX instructions based on `__builtin_cpu_supports`.
* **GPU (CUDA and HIP)**
* Several optimized math functions added, better support for `std::complex`.
* Added option to disable CUDA entirely by defining `EIGEN_NO_CUDA`.
* Many more functions can now be used in device code (e.g. comparisons, small matrix inversion).
* **ZVector**
* Vectorized `float` and `std::complex<float>` support added.
* Added z14 support.
* **SYCL**
* Redesigned SYCL implementation for use with the [https://eigen.tuxfamily.org/dox/unsupported/eigen_tensors.html Tensor] module, which can be enabled by defining `EIGEN_USE_SYCL`.
* New generic memory model introduced used by `TensorDeviceSycl`.
* Better integration with OpenCL devices.
* Added many math function specializations.
### Miscellaneous API Changes
* New `setConstant(...)` methods for preserving one dimension of a matrix by passing in `NoChange`.
* Added `setUnit(Index i)` for vectors that sets the ''i'' th coefficient to one and all others to zero.
* Added `transpose()`, `adjoint()`, `conjugate()` methods to `SelfAdjointView`.
* Added `shiftLeft<N>()` and `shiftRight<N>()` coefficient-wise arithmetic shift functions to Arrays.
* Enabled adding and subtracting of diagonal expressions.
* Added `EIGEN_ALIGNOF(X)` macro for determining alignment of a provided variable.
* Allow plugins for `VectorwiseOp` by defining a file `EIGEN_VECTORWISEOP_PLUGIN` (e.g. `-DEIGEN_VECTORWISEOP_PLUGIN=my_vectorwise_op_plugins.h`).
* Allow disabling of IO operations by defining `EIGEN_NO_IO`.
### Improvement to NaN propagation
* Improvements to NaN correctness for elementwise functions.
* New `NaNPropagation` template argument to control whether NaNs are propagated or suppressed in elementwise `min/max` and corresponding reductions on `Array`, `Matrix`, and `Tensor`.
### New low-latency non-blocking ThreadPool module
* Originally a part of the Tensor module, `Eigen::ThreadPool` is now separate and more portable, and forms the basis for multi-threading in TensorFlow, for example.
### Changes to Tensor module
* Support for c++03 was officially dropped in Tensor module, since most of the code was written in c++11 anyway. This will prevent building the code for CUDA with older version of `nvcc`.
* Performance optimizations of Tensor contraction
* Speed up "outer-product-like" operations by parallelizing over the contraction dimension, using thread_local buffers and recursive work splitting.
* Improved threading heuristics.
* Support for fusing element-wise operations into contraction during evaluation.
* Performance optimizations of other Tensor operator
* Speedups from improved vectorization, block evaluation, and multi-threading for most operators.
* Significant speedup to broadcasting.
* Reduction of index computation overhead, e.g. using fast divisors in TensorGenerator, squeezing dimensions in TensorPadding.
* Complete rewrite of the block (tiling) evaluation framework for tensor expressions lead to significant speedups and reduced number of memory allocations.
* Added new API for asynchronous evaluation of tensor expressions.
* Misc. minor behavior changes & fixes:
* Fix const correctness for TensorMap.
* Modify tensor argmin/argmax to always return first occurrence.
* More numerically stable tree reduction.
* Improve randomness of the tensor random generator.
* Update the padding computation for `PADDING_SAME` to be consistent with TensorFlow.
* Support static dimensions (aka IndexList) in resizing/reshape/broadcast.
* Improved accuracy of Tensor FFT.
### Changes to sparse iterative solvers
* Added new IDRS iterative linear solver.
### Other relevant changes
* Eigen now provides an option to test with an external BLAS library
See the [announcement](https://www.eigen.tuxfamily.org/index.php?title=3.4) for more details.
* Commit 4e5385c90: Introduce rendering Doxygen math formulas with MathJax and the option `EIGEN_DOC_USE_MATHJAX` to control this.
*#1746: Removed implementation of standard copy-constructor and standard copy-assign-operator from PermutationMatrix and Transpositions to allow malloc-less `std::move`.
*#2036: Make sure the find_standard_math_library_test_program compiles and doesn't optimize away functions we try to test for.
*#2046: Rename test/array.cpp to test/array_cwise.cpp to fix an issue with the C++ standard library header "array"
*#2040: Fix an issue in test/ctorleak that occured when disabling exceptions.
*#2011: Remove error counting in OpenMP parallel section in Eigen's GEMM parallelizing logic.
*#2012: Define coeff-wise binary array operators for base class to fix an issue when using Eigen with C++20
* Commit bfdd4a990: Fix an issue with Intel® MKL PARDISO support.
*#1995: Fix a failure in the GEBP kernel when using small L1 cache sizes, OpenMP and FMA.
*#1990: Make CMake accept installation paths relative to `CMAKE_INSTALL_PREFIX`.
*#1974: Fix issue when reserving an empty sparse matrix
*#1823: Fix incorrect use of `std::abs`
*#1788: Fix rule-of-three violations inside the stable modules. This fixes deprecated-copy warnings when compiling with GCC>=9 Also protect some additional Base-constructors from getting called by user code code (#1587)
*#1796: Make matrix squareroot usable for Map and Ref types
*#1281: Fix AutoDiffScalar's make_coherent for nested expression of constant ADs.
*#1761: Fall back `is_integral` to `std::is_integral` in c++11 and fix `internal::is_integral<size_t/ptrdiff_t>` with MSVC 2013 and older.
*#1741: Fix `self_adjoint*matrix`, `triangular*matrix`, and `triangular^1*matrix` with a destination having a non-trivial inner-stride
*#1741: Fix SelfAdjointView::rankUpdate and product to triangular part for destination with non-trivial inner stride
*#1741: Fix `C.noalias() = A*C;` with `C.innerStride()!=1`
*#1695: Fix a numerical robustness issue in BDCSVD
*#1692: Enable enum as sizes of Matrix and Array
*#1689: Fix used-but-marked-unused warning
*#1679: Avoid possible division by 0 in complex-schur
*#1676: Fix C++17 template deduction in DenseBase
*#1669: Fix PartialPivLU/inverse with zero-sized matrices.
*#1557: Fix RealSchur and EigenSolver for matrices with only zeros on the diagonal.
* Performance related fixes
*#1562: Optimize evaluation of small products of the form s*A*B by rewriting them as: s*(A.lazyProduct(B)) to save a costly temporary. Measured speedup from 2x to 5x...
* Commit 165db26dc and 8ee2e10af: Fix performance issue with SimplicialLDLT for complexes coefficients
* Misc commits
* Commit 5f1082d0b: Fix `QuaternionBase::cast` for quaternion map and wrapper.
* Commit a153dbae9: Fix case issue with Lapack unit tests.
* Commit 3d7e2a1f3: Fix possible conflict with an externally defined "real" type when using gcc-5.
* Commit 1760432f6: Provide `numext::[u]int{32,64}_t`.
* Commit 3d18879fc: Initialize isometric transforms like affine transforms.
* Commit 160c0a340: Change typedefs from private to protected to fix MSVC compilation.
* Commit 3cf273591: Fix compilation of FFTW unit test.
* Commit 6abc9e537: Fix compilation of BLAS backend and frontend.
*#1974: Fix issue when reserving an empty sparse matrix
*#1823: Fix incorrect use of `std::abs`
*#1788: Fix rule-of-three violations inside the stable modules. This fixes deprecated-copy warnings when compiling with GCC>=9 Also protect some additional Base-constructors from getting called by user code code (#1587)
*#1796: Make matrix squareroot usable for Map and Ref types
*#1281: Fix AutoDiffScalar's `make_coherent` for nested expression of constant ADs.
*#1761: Fall back `is_integral` to `std::is_integral` in c++11 and fix `internal::is_integral<size_t/ptrdiff_t>` with MSVC 2013 and older.
*#1741: Fix `self_adjoint*matrix`, `triangular*matrix`, and `triangular^1*matrix` with a destination having a non-trivial inner-stride
*#1741: Fix SelfAdjointView::rankUpdate and product to triangular part for destination with non-trivial inner stride
*#1741: Fix `C.noalias() = A*C;` with `C.innerStride()!=1`
*#1695: Fix a numerical robustness issue in BDCSVD
*#1692: Enable enum as sizes of Matrix and Array
*#1689: Fix used-but-marked-unused warning
*#1679: Avoid possible division by 0 in complex-schur
*#1676: Fix C++17 template deduction in DenseBase
*#1669: Fix PartialPivLU/inverse with zero-sized matrices.
*#1557: Fix RealSchur and EigenSolver for matrices with only zeros on the diagonal.
* Performance related fixes
*#1562: Optimize evaluation of small products of the form s*A*B by rewriting them as: s*(A.lazyProduct(B)) to save a costly temporary. Measured speedup from 2x to 5x...
* Commit 165db26dc and 8ee2e10af: Fix performance issue with SimplicialLDLT for complexes coefficients
* Misc commits
* Commit 5f1082d0b: Fix `QuaternionBase::cast` for quaternion map and wrapper.
* Commit a153dbae9: Fix case issue with Lapack unit tests.
* Commit 3d7e2a1f3: Fix possible conflict with an externally defined "real" type when using gcc-5.
* Commit 1760432f6: Provide `numext::[u]int{32,64}_t`.
* Commit 3d18879fc: Initialize isometric transforms like affine transforms.
* Commit 160c0a340: Change typedefs from private to protected to fix MSVC compilation.
* Commit 3cf273591: Fix compilation of FFTW unit test.
* Commit 6abc9e537: Fix compilation of BLAS backend and frontend.
* Several AVX512 fixes for `log`, `sqrt`, `rsqrt`, non `AVX512ER` CPUs, `apply_rotation_in_the_plane` 5c59564bfb92 1939c971a3db c2f9e6cb37e5, 609e425166f6.
* AltiVec fixes: 1641a6cdd5a4
* NEON fixes: const-cast (877a2b64c9ba), compilation of Jacobi rotations (bc837b797559,#1436).
* Changeset 971b32440c74: Define `pcast<>` for SSE types even when AVX is enabled. (otherwise float are silently reinterpreted as int instead of being converted)
*#1494: makes `pmin`/`pmax` behave on Altivec/VSX as on x86 regarding NaNs (892c0a79ce93)
* Enable linear indexing in generic block evaluation (15752027ec2f, 80af7d6a47c1, #1543).
* Fix packet and alignment propagation logic of `Block<Xpr>` expressions. In particular, `(A+B).col(j)` now preserve vectorisation. (9c9e90f6db7e)
* Several fixes regarding custom scalar type support: hypot (385d8b5e42c2), boost-multiprec (5f71579a2d3f), literal casts (e6577f3c3049, fbb0c510c52f),
* LLT: avoid making a copy when decomposing in place (9d03711df8bc), const the arg to `solveInPlace()` to allow passing `.transpose()`, `.block()`, etc. (0137ed4f19b6).
* Add possibility to overwrite `EIGEN_STRONG_INLINE` (6d6e5fcd4356)
*#1528: use `numeric_limits::min()` instead of `1/highest()` that might underflow (9ff315024335)
*#1532: disable `stl::*_negate` in C++17 (they are deprecated) (3fb42ff7b278)
* Add C++11 `max_digits10` for half (70ac6c923001)
* Make sparse QR result sizes consistent with dense QR (2136cfa17e28)
For a comprehensive list of change since the 3.2 series, see this [page](https://www.eigen.tuxfamily.org/index.php?title=3.3).
Main changes since 3.3-rc1:
* Core module
* Add supports for AVX512 SIMD instruction set.
* Bugs #698 and #1004: Improve numerical robustness of LinSpaced methods for both real and integer scalar types ([details](http://eigen.tuxfamily.org/dox-devel/classEigen_1_1DenseBase.html#aaef589c1dbd7fad93f97bd3fa1b1e768)).
* Fix a regression in `X = (X*X.transpose())/scalar` with `X` rectangular (`X` was resized before the evaluation).
*#1311: Fix alignment logic in some cases of `(scalar*small).lazyProduct(small)`
*#1317: fix a performance regression from 3.2 with clang and some nested block expressions.
*#1308: fix compilation of some small products involving nullary-expressions.
*#1333: Fix a regression with `mat.array().sum()`
*#1328: Fix a compilation issue with old compilers introduced in 3.3-rc1.
*#1325: Fix compilation on NEON with clang
* Properly handle negative inputs in vectorized sqrt.
* Improve cost-model to determine the ideal number of threads in matrix-matrix products.
* Geometry module
*#1304: Fix `Projective * scaling` and `Projective *= scaling`.
*#1310: Workaround a compilation regression from 3.2 regarding triangular * homogeneous
*#1312: Quaternion to AxisAngle conversion now ensures the angle will be in the range `[0,pi]`. This also increases accuracy when `q_w` is negative.
* Tensor module
* Add support for OpenCL.
* Improved random number generation.
* Other
*#1330: SuiteSparse, explicitly handle the fact that Cholmod does not support single precision float numbers.
* SuiteSparse, fix SPQR for rectangular matrices
* Fix compilation of `qr.inverse()` for column and full pivoting variants
For a comprehensive list of change since the 3.2 series, see this [page](https://www.eigen.tuxfamily.org/index.php?title=3.3).
Main changes since 3.3-beta2:
* New features and improvements:
*#645: implement eigenvector computation in GeneralizedEigenSolver
*#1271: add a `SparseMatrix::coeffs()` method returning a linear view of the non-zeros (for compressed mode only).
*#1286: Improve support for custom nullary functors: now the functor only has to expose one relevant operator among `f()`, `f(i)`, `f(i,j)`.
*#1272: improve comma-initializer in handling empty matrices.
*#1268: detect failure in LDLT and report them through info()
* Add support for scalar factor in sparse-selfadjoint `*` dense products, and enable `+=`/`-=` assignment for such products.
* Remove temporaries in product expressions matching `d?=a-b*c` by rewriting them as `d?=a; d?=b*c;`
* Vectorization improvements for some small product cases.
* Doc:
*#1265: fix outdated doc in QR facto
*#828: improve documentation of sparse block methods, and sparse unary methods.
* Improve documentation regarding nullary functors, and add an example demonstrating the use of nullary expression to perform fancy matrix manipulations.
* Doc: explain how to use Accelerate as a LAPACK backend.
* Bug fixes and internal changes:
* Numerous fixes regarding support for custom complex types.
*#1273: fix shortcoming in `eigen_assert` macro
*#1278: code formatting
*#1270: by-pass hand written `pmadd` with recent clang versions.
*#1282: fix implicit double to float conversion warning
*#1167: simplify installation of header files using cmake's `install(DIRECTORY ...)` command
*#1283: fix products involving an uncommon `vector.block(..)` expressions.
*#1285: fix a minor regression in LU factorization.
* JacobiSVD now consider any denormal number as zero.
* Numerous fixes regarding support for CUDA/NVCC (including bugs #1266)
* Fix an alignment issue in gemv, symv, and trmv for statically allocated temporaries.
* Fix 4x4 matrix inversion for non-linear destinations.
* Numerous improvements and fixes in half precision scalar type.
* Fix vectorization logic for coeff-based product for some corner cases
* Bugs #1260, #1261, #1264: several fixes in AutoDiffScalar.
For a comprehensive list of change since the 3.2 series, see this [page](https://www.eigen.tuxfamily.org/index.php?title=3.3).
Main changes since 3.3-beta1:
* Dense features:
*#707: Add support for [inplace](http://eigen.tuxfamily.org/dox-devel/group__InplaceDecomposition.html) dense decompositions.
*#977: normalize(d) left the input unchanged if its norm is 0 or too close to 0.
*#977: add stableNormalize[d] methods: they are analogues to normalize[d] but with carefull handling of under/over-flow.
*#279: Implement generic scalar*expr and expr*scalar operators. This is especially useful for custom scalar types, e.g., to enable `float*expr<multi_prec>` without conversion.
* New unsupported/Eigen/SpecialFunctions module providing the following coefficient-wise math functions: erf, erfc, lgamma, digamma, polygamma, igamma, igammac, zeta, betainc.
* Add fast reciprocal condition estimators in dense LU and Cholesky factorizations.
*#1230: add support for `SelfadjointView::triangularView()` and `diagonal()`
*#823: add `Quaternion::UnitRandom()` method.
* Add exclusive or operator for bool arrays.
* Relax dependency on MKL for `EIGEN_USE_BLAS` and `EIGEN_USE_LAPACKE`: any BLAS and LAPACK libraries can now be used as backend (see [doc](http://eigen.tuxfamily.org/dox-devel/TopicUsingBlasLapack.html)).
* Add static assertion to `x()`, `y()`, `z()`, `w()` accessors
*#51: avoid dynamic memory allocation in fixed-size rank-updates, matrix products evaluated within a triangular part, and selfadjoint times matrix products.
*#696: enable zero-sized block at compile-time by relaxing the respective assertion
*#779: in `Map`, allows non aligned buffers for buffers smaller than the requested alignment.
* Add a complete orthogonal decomposition class: [CompleteOrthogonalDecomposition](http://eigen.tuxfamily.org/dox-devel/classEigen_1_1CompleteOrthogonalDecomposition.html)
* Improve robustness of JacoviSVD with complexes (underflow, noise amplification in complex to real conversion, compare off-diagonal entries to the current biggest diagonal entry instead of the global biggest, null inputs).
*#1214: consider denormals as zero in D&C SVD. This also workaround infinite binary search when compiling with ICC's unsafe optimizations.
* Add log1p for arrays.
*#1193: now `lpNorm<Infinity>` supports empty inputs.
*#1151: remove useless critical section in matrix product
* Add missing non-const reverse method in `VectorwiseOp` (e.g., this enables `A.rowwise().reverse() = ...`)
* Update RealQZ to reduce 2x2 diagonal block of T corresponding to non reduced diagonal block of S to positive diagonal form.
* Sparse features:
*#632: add support for "dense +/- sparse" operations. The current implementation is based on SparseView to make the dense subexpression compatible with the sparse one.
*#946: generalize `Cholmod::solve` to handle any rhs expressions.
*#1150: make IncompleteCholesky more robust by iteratively increase the shift until the factorization succeed (with at most 10 attempts)
*#557: make InnerIterator of sparse storage types more versatile by adding default-ctor, copy-ctor/assignment.
*#694: document that `SparseQR::matrixR` is not sorted.
* Block expressions now expose all the information defining the block.
* Fix GMRES returned error.
*#1119: add support for SuperLU 5
* Performance improvements:
*#256: enable vectorization with unaligned loads/stores. This concerns all architectures and all sizes. This new behavior can be disabled by defining `EIGEN_UNALIGNED_VECTORIZE=0`
* Add support for s390x(zEC13) ZVECTOR instruction set.
* Optimize mixing of real with complex matrices by avoiding a conversion from real to complex when the real types do not match exactly. (see 76faf4a9657e)
* Speedup square roots in performance critical methods such as norm, normalize(d).
*#1154: use dynamic scheduling for spmv products.
*#667, #1181: improve perf with MSVC and ICC through `FORCE_INLINE`
* Improve heuristics for switching between coeff-based and general matrix product implementation at compile-time.
* Add vectorization of tanh for float (SSE/AVX)
* Improve cost estimates of numerous functors.
* Numerous improvements regarding half-packet vectorization: coeff-based products (e.g., `Matrix4f*Vector4f` is now vectorized again when using AVX), reductions, linear vs inner traversals.
* Fix performance regression: with AVX, unaligned stores were emitted instead of aligned ones for fixed size assignment.
*#1201: optimize `affine*vector` products.
*#1191: prevent Clang/ARM from rewriting VMLA into VMUL+VADD.
* Small speed-up in `Quaternion::slerp`.
*#1201: improve code generation of affine*vec with MSVC
* Doc:
* Add [documentation and exemple](http://eigen.tuxfamily.org/dox-devel/group__MatrixfreeSolverExample.html) for matrix-free solving.
* A new documentation [page](http://eigen.tuxfamily.org/dox-devel/group__CoeffwiseMathFunctions.html) summarizing coefficient-wise math functions.
*#1144: clarify the doc about aliasing in case of resizing and matrix product.
* A new documentation [page](http://eigen.tuxfamily.org/dox-devel/group__DenseDecompositionBenchmark.html) summarizing the true performance of Eigen's dense decomposition algorithms.
* Misc improvements:
* Allow one generic scalar argument for all binary operators/functions.
* Add a `EIGEN_MAX_CPP_VER` option to limit the C++ version to be used, as well as [fine grained options](http://eigen.tuxfamily.org/dox-devel/TopicPreprocessorDirectives.html#title1) to control individual language features.
* A new [ScalarBinaryOpTraits](http://eigen.tuxfamily.org/dox-devel/structEigen_1_1ScalarBinaryOpTraits.html) class allowing to control how different scalar types are mixed.
*`NumTraits` now exposes a `digits10` function making `internal::significant_decimals_impl` deprecated.
* Countless improvements and fixes in Tensors module.
*#1156: fix several function declarations whose arguments were passed by value instead of being passed by reference
*#1164: fix `std::list` and `std::deque` specializations such that our aligned allocator is automatically activated only when the user did not specified an allocator (or specified the default std::allocator).
*#795: mention allocate_shared as a candidate for aligned_allocator.
*#1170: skip calls to memcpy/memmove for empty inputs.
*#1203: by-pass large stack-allocation in stableNorm if `EIGEN_STACK_ALLOCATION_LIMIT` is too small
* Improve constness of blas level-2/3 interface.
* Implement stricter argument checking for SYRK and SY2K
* Countless improvements in the documentations.
* Internal: Remove `posix_memalign`, `_mm_malloc`, and `_aligned_malloc` special paths.
* Internal: Remove custom unaligned loads for SSE
* Internal: introduce `[U]IntPtr` types to be used for casting pointers to integers.
* Internal: `NumTraits` now exposes `infinity()`
* Internal: `EvalBeforeNestingBit` is now deprecated.
*#1213: workaround gcc linking issue with anonymous enums.
*#1242: fix comma initializer with empty matrices.
*#725: make move ctor/assignment noexcept
* Add minimal support for `Array<string>`
* Improve support for custom scalar types bases on expression template (e.g., `boost::multiprecision::number<>` type). All dense decompositions are successfully tested.
* Most visible fixes:
*#1144: fix regression in `x=y+A*x` (aliasing issue)
*#1140: fix usage of `_mm256_set_m128` and `_mm256_setr_m128` in AVX support
*#1141: fix some missing initializations in CholmodSupport
*#1143: workaround gcc bug #10200
*#1145, #1147, #1148, #1149: numerous fixes in PastixSupport
*#1153: don't rely on `__GXX_EXPERIMENTAL_CXX0X__` to detect C++11 support.
*#1152: fix data race in static initialization of blas routines.
* fix some buffer overflow in product block size computation.
*#96, #1006: fix by value argument in result_of
*#178: clean several `const_cast`.
* Fix compilation in `ceil()` function.
*#698: fix linspaced for integer types.
*#1161: fix division by zero for huge scalar types in cache block size computation.
*#774: fix a numerical issue in Umeyama algorithm that produced unwanted reflections.
*#901: fix triangular-view with unit diagonal of sparse rectangular matrices.
*#1166: fix shortcoming in gemv when the destination is not a vector at compile-time.
*#1172: make `SparseMatrix::valuePtr` and `innerIndexPtr` properly return null for empty matrices
*#537: fix a compilation issue in Quaternion with Apples's compiler
*#1186: fix usage of `vreinterpretq_u64_f64` (NEON)
*#1190: fix usage of `__ARM_FEATURE_FMA` on Clang/ARM
*#1189: fix pow/atan2 compilation for `AutoDiffScalar`
* Fix detection of same input-output when applied permutations, or on solve operations.
* Workaround a division by zero in triangular solve when outerstride==0
* Fix compilation of s`parse.cast<>().transpose()`.
* Fix double-conversion warnings throughout the code.
*#1207: fix logical-op warnings
*#1222, #1223: fix compilation in `AutoDiffScalar`.
*#1229: fix usage of `Derived::Options` in MatrixFunctions.
*#1224: fix regression in `(dense*dense).sparseView()`.
* Improve numerical robustness of JacobiSVD (backported from 3.3)
*#1017: prevents underflows in `makeHouseholder`
* Fix numerical accuracy issue in the extraction of complex eigenvalue pairs in real generalized eigenvalue problems.
* Fix support for `vector.homogeneous().asDiagonal()`
*#1238: fix `SparseMatrix::sum()` overload for un-compressed mode
*#1213: workaround gcc linking issue with anonymous enums.
*#1236: fix possible integer overflow in sparse-sparse product
* Improve detection of identical matrices when applying a permutation (e.g., `mat = perm * mat`)
* Fix usage of nesting type in blas_traits. In practice, this fixes compilation of expressions such as `A*(A*A)^T`
* CMake: fixes support of Ninja generator
* Add a StorageIndex typedef to sparse matrices and expressions to ease porting code to 3.3 (see http://eigen.tuxfamily.org/index.php?title=3.3#Index_typedef)
*#1200: make `aligned_allocator` c++11 compatible (backported from 3.3)
*#1182: improve generality of `abs2` (backported from 3.3)
*#537: fix compilation of Quaternion with Apples's compiler
*#1176: allow products between compatible scalar types
*#1172: make `valuePtr` and `innerIndexPtr` properly return null for empty sparse matrices.
*#1170: skip calls to `memcpy`/`memmove` for empty inputs.
* Others:
*#1242: fix comma initializer with empty matrices.
* Improves support for MKL's PARDISO solver.
* Fix a compilation issue with Pastix solver.
* Add some missing explicit scalar conversions
* Fix a compilation issue with matrix exponential (unsupported MatrixFunctions module).
*#734: fix a storage order issue in unsupported Spline module
*#1222: fix a compilation issue in AutoDiffScalar
*#1221: shutdown some GCC6's warnings.
*#1175: fix index type conversion warnings in sparse to dense conversion.
* Make `FullPivLU::solve` use `rank()` instead of `nonzeroPivots()`.
* Add `EIGEN_MAPBASE_PLUGIN`
*#1166: fix issue in matrix-vector products when the destination is not a vector at compile-time.
*#1100: Improve cmake/pkg-config support.
*#1113: fix name conflict with C99's "I".
* Add missing delete operator overloads in `EIGEN_MAKE_ALIGNED_OPERATOR_NEW`
* Fix `(A*B).maxCoeff(i)` and similar.
* Workaround an ICE with VC2015 Update1 x64.
*#1156: fix several function declarations whose arguments were passed by value instead of being passed by reference
*#1164: fix `std::list` and `std::deque` specializations such that our aligned allocator is automatically activatived only when the user did not specified an allocator (or specified the default `std::allocator`).
* Others:
* Fix BLAS backend (aka MKL) for empty matrix products.
*#1134: fix JacobiSVD pre-allocation.
*#1111: fix infinite recursion in `sparse_column_major.row(i).nonZeros()` (it now produces a compilation error)
*#1106: workaround a compilation issue in Sparse module for msvc-icc combo
*#1153: remove the usage of `__GXX_EXPERIMENTAL_CXX0X__` to detect C++11 support
*#1143: work-around gcc bug in COLAMD
* Improve support for matrix products with empty factors.
* Fix and clarify documentation of Transform wrt `operator*(MatrixBase)`
* Add a matrix-free conjugate gradient example.
* Fix cost computation in CwiseUnaryView (internal)
For a comprehensive list of change since the 3.2 series, see this [page](https://www.eigen.tuxfamily.org/index.php?title=3.3).
Main changes since 3.3-alpha1:
* Dense features:
* Add `LU::transpose().solve()` and `LU::adjoint().solve()` API.
* Add `Array::rsqrt()` method as a more efficient shorcut for `sqrt().inverse()`.
* Add `Array::sign()` method for real and complexes.
* Add `lgamma`, `erf`, and `erfc` functions for arrays.
* Add support for row/col-wise `lpNorm()`.
* Add missing `Rotation2D::operator=(Matrix2x2)`.
* Add support for `permutation * homogenous`.
* Improve numerical accuracy in LLT and triangular solve by using true scalar divisions (instead of x * (1/y)).
* Add `EIGEN_MAPBASE_PLUGIN` and `EIGEN_QUATERNION_PLUGIN`.
*#1074: forbid the creation of PlainObjectBase objects.
* Sparse features:
* Add IncompleteCholesky preconditioner.
* Improve support for [matrix-free iterative solvers](http://eigen.tuxfamily.org/dox/group__MatrixfreeSolverExample.html)
* Extend `setFromTriplets` API to allow passing a functor object controlling how to collapse duplicated entries.
*#918: add access to UmfPack return code and parameters.
* Add support for `dense.cwiseProduct(sparse)`, thus enabling `(dense*sparse).diagonal()` expressions.
* Add support to directly evaluate the product of two sparse matrices within a dense matrix.
*#1064: add support for `Ref<SparseVector>`.
* Add supports for real mul/div `sparse<complex>` operations.
*#1086: replace deprecated `UF_long` by `SuiteSparse_long`.
* Make `Ref<SparseMatrix>` more versatile.
* Performance improvements:
*#1115: enable static alignment and thus small size vectorization on ARM.
* Add temporary-free evaluation of `D.nolias() *= C + A*B`.
* Add vectorization of round, ceil and floor for SSE4.1/AVX.
* Optimize assignment into a `Block<SparseMatrix>` by using Ref and avoiding useless updates in non-compressed mode. This make row-by-row filling of a row-major sparse matrix very efficient.
* Enable unaligned vectorization of small fixed size matrix products.
* Misc improvements:
* Improve support for `isfinite`/`isnan`/`isinf` in fast-math mode.
* Make the IterativeLinearSolvers module compatible with MPL2-only mode by defaulting to COLAMDOrdering and NaturalOrdering for ILUT and ILLT respectively.
* Avoid any OpenMP calls if multi-threading is explicitly disabled at runtime.
* Make abs2 compatible with custom complex types.
*#1109: use noexcept instead of throw for C++11 compilers.
*#1100: Improve cmake/pkg-config support.
* Countless improvements and fixes in Tensors module.
* Most visible fixes:
*#1105: fix default preallocation when moving from compressed to uncompressed mode in SparseMatrix.
* Fix UmfPackLU constructor for expressions.
* Fix degenerate cases in syrk and trsm BLAS API.
* Fix matrix to quaternion (and angleaxis) conversion for matrix expression.
* Fix compilation of sparse-triangular to dense assignment.
* Fix several minor performance issues in the nesting of matrix products.
*#1092: fix iterative solver ctors for expressions as input.
*#1099: fix missing include for CUDA.
*#1102: fix multiple definition linking issue.
*#1088: fix setIdenity for non-compressed sparse-matrix.
* Fix `SparseMatrix::insert`/`coeffRef` for non-empty compressed matrix.
*#1113: fix name conflict with C99's "I".
*#1075: fix `AlignedBox::sample` for runtime dimension.
*#1103: fix NEON vectorization of `complex<double>` multiplication.
* Fix a regression regarding `(dense*sparse).diagonal()`.
* Make the `IterativeLinearSolvers` module compatible with MPL2-only mode by defaulting to `COLAMDOrdering` and `NaturalOrdering` for ILUT and ILLT respectively.
*#266: backport support for c++11 move semantic
*`operator/=(Scalar)` now performs a true division (instead of `mat*(1/s)`)
* Improve numerical accuracy in LLT and triangular solve by using true scalar divisions (instead of `mat * (1/s)`)
*#1092: fix iterative solver constructors for expressions as input
*#1088: fix `setIdenity` for non-compressed sparse-matrix
*#1086: add support for recent SuiteSparse versions
* Others:
* Add overloads for real-scalar times `SparseMatrix<complex>` operations. This avoids real to complex conversions, and also fixes a compilation issue with MSVC.
* Use explicit Scalar types for AngleAxis initialization
* Fix several shortcomings in cost computation (avoid multiple re-evaluation in some very rare cases).
*#1090: fix a shortcoming in redux logic for which slice-vectorization plus unrolling might happen.
* Fix compilation issue with MSVC by backporting `DenseStorage::operator=` from devel branch.
*#1063: fix nesting of unsupported/AutoDiffScalar to prevent dead references when computing second-order derivatives
*#1100: remove explicit `CMAKE_INSTALL_PREFIX` prefix to conform to cmake install's `DESTINATION` parameter.
* unsupported/ArpackSupport is now properly installed by make install.
*#859: fix returned values for vectorized versions of `exp(NaN)`, `log(NaN)`, `sqrt(NaN)` and `sqrt(-1)`.
*#879: tri1 = mat * tri2 was compiling and running incorrectly if tri2 was not numerically triangular. Workaround the issue by evaluating mat*tri2 into a temporary.
*#854: fix numerical issue in SelfAdjointEigenSolver::computeDirect for 3x3 matrices.
*#884: make sure there no call to malloc for zero-sized matrices or for a Ref<> without temporaries.
*#890: fix aliasing detection when applying a permutation.
*#898: MSVC optimization by adding inline hint to const_cast_ptr.
*#853: remove enable_if<> in Ref<> ctor.
* Dense solvers:
*#894: fix the sign returned by LDLT for multiple calls to `compute()`.
* Fix JacobiSVD wrt underflow and overflow.
*#791: fix infinite loop in JacobiSVD in the presence of NaN.
* Sparse:
* Fix out-of-bounds memory write when the product of two sparse matrices is completely dense and performed using pruning.
* UmfPack support: fix redundant evaluation/copies when calling `compute()`, add support for generic expressions as input, and fix extraction of the L and U factors (#911).
* Improve `SparseMatrix::block` for const matrices (the generic path was used).
* Fix memory pre-allocation when permuting inner vectors of a sparse matrix.
* Fix `SparseQR::rank` for a completely empty matrix.
* Fix `SparseQR` for row-major inputs.
* Fix `SparseLU::absDeterminant` and add respective unit test.
* BiCGSTAB: make sure that good initial guesses are not destroyed by a bad preconditioner.
* Geometry:
* Fix `Hyperplane::Through(a,b,c)` when points are aligned or identical.
* Fix linking issues in OpenGLSupport.
* OS, build system and doc:
* Various compilation fixes including: #821, #822, #857, #871, #873.
* Fix many compilation warnings produced by recent compilers including: #909.
* Relax Ref such that `Ref<MatrixXf>` accepts a `RowVectorXf` which can be seen as a degenerate `MatrixXf(1,N)`
* Fix performance regression for the vectorization of sub columns/rows of matrices.
*`EIGEN_STACK_ALLOCATION_LIMIT`: Raise its default value to 128KB, make use of it to assert on maximal fixed size object, and allows it to be 0 to mean "no limit".
*#839: Fix 1x1 triangular matrix-vector product.
*#755:`CommaInitializer` produced wrong assertions in absence of Return-Value-Optimization.
* Dense solvers:
* Add a `rank()` method with threshold control to JacobiSVD, and make solve uses it to return the minimal norm solution for rank-deficient problems.
* Various numerical fixes in JacobiSVD, including:#843, and the move from Lapack to Matlab strategy for the default threshold.
* Various numerical fixes in LDLT, including the case of semi-definite complex matrices.
* Fix `ColPivHouseholderQR::rank()`.
*#222: Make temporary matrix column-major independently of `EIGEN_DEFAULT_TO_ROW_MAJOR` in BlockHouseholder.
* Sparse:
*#838: Fix `dense * sparse` and `sparse * dense` outer products and detect outer products from either the lhs or rhs.
* Make the ordering method of SimplicialL[D]LT configurable.
* Fix regression in the restart mechanism of BiCGSTAB.
*#836: extend SparseQR to support more columns than rows.
*#808: Use double instead of float for the increasing size ratio in `CompressedStorage::resize`, fix implicit conversions from int/longint to float/double, and fix `set_from_triplets` temporary matrix type.
*#647: Use `smart_copy` instead of bitwise memcpy in CompressedStorage.
* GMRES: Initialize essential Householder vector with correct dimension.
* Geometry:
*#807: Missing scalar type cast in `umeyama()`
*#806: Missing scalar type cast in `Quaternion::setFromTwoVectors()`
*#759: Removed hard-coded double-math from `Quaternion::angularDistance`.
* OS, build system and doc:
* Fix compilation with Windows CE.
* Fix some ICEs with VC11.
* Check IMKL version for compatibility with Eigen
*#754: Only inserted (`!defined(_WIN32_WCE)`) analog to alloc and free implementation.
*#803: Avoid `char*` to `int*` conversion.
*#819: Include path of details.h file.
*#738: Use the "current" version of cmake project directories to ease the inclusion of Eigen within other projects.
*#815: Fix doc of FullPivLU wrt permutation matrices.
*#632: doc: Note that `dm2 = sm1 + dm1` is not possible
* New [`Ref<>`](http://eigen.tuxfamily.org/dox-devel/classEigen_1_1Ref.html) class allowing to write non templated function taking various kind of Eigen dense objects without copies.
* New [RealQZ](http://eigen.tuxfamily.org/dox-devel/classEigen_1_1RealQZ.html) factorization and [GeneralizedEigenSolver](http://eigen.tuxfamily.org/dox-devel/classEigen_1_1GeneralizedEigenSolver.html).
* Add vector-wise normalized and normalize functions, and hasNaN/allFinite members.
* Optimize outer products for non rank-1 update operations.
* Optimize diagonal products (enable vectorization in more cases).
* Improve robustness and performance in `JacobiSVD::solve()`.
* Sparse world
* New [SparseLU](http://eigen.tuxfamily.org/dox-devel/group__SparseLU__Module.html) module: built-in sparse LU with supernodes and numerical row pivoting (port of SuperLU making the SuperLUSupport module obsolete).
* New [SparseQR](http://eigen.tuxfamily.org/dox-devel/group__SparseQR__Module.html) module: rank-revealing sparse QR factorization with numerical column pivoting.
* New [COLAMD](http://eigen.tuxfamily.org/dox-devel/classEigen_1_1COLAMDOrdering.html) ordering and unified [ordering API](http://eigen.tuxfamily.org/dox-devel/group__OrderingMethods__Module.html).
* Add support for generic blocks of sparse matrices (read-only).
* Add conservative resize feature on sparse matrices.
* Add uniform support for solving sparse systems with sparse right hand sides.
* Add support for sparse matrix time sparse self-adjoint view products.
* Improve BiCGSTAB robustness with restart.
* Support to external libraries
* New [MetisSupport](http://eigen.tuxfamily.org/dox-devel/group__MetisSupport__Module.html) module: wrapper to the famous graph partitioning library.
* New [SPQRSupport](http://eigen.tuxfamily.org/dox-devel/group__SPQRSupport__Module.html) module: wrapper to suitesparse's supernodal QR solver.
Eigen 3.2 represents about 600 commits since Eigen 3.1.
* A new [`Ref<>`](http://eigen.tuxfamily.org/dox-devel/classEigen_1_1Ref.html) class allowing to write non templated function taking various kind of Eigen dense objects without copies.
* New [RealQZ](http://eigen.tuxfamily.org/dox-devel/classEigen_1_1RealQZ.html) factorization and [GeneralizedEigenSolver](http://eigen.tuxfamily.org/dox-devel/classEigen_1_1GeneralizedEigenSolver.html)
* Optimized outer products for non rank-1 update operations.
* Sparse modules
* New [SparseLU](http://eigen.tuxfamily.org/dox-devel/group__SparseLU__Module.html) module: built-in sparse LU with supernodes and numerical row pivoting (port of SuperLU making the SuperLUSupport module obsolete).
* New [SparseQR](http://eigen.tuxfamily.org/dox-devel/group__SparseQR__Module.html) module: rank-revealing sparse QR factorization with numerical column pivoting.
* OrderingMethods: extended with [COLAMD](http://eigen.tuxfamily.org/dox-devel/classEigen_1_1COLAMDOrdering.html) ordering and a unified [ordering](http://eigen.tuxfamily.org/dox-devel/group__OrderingMethods__Module.html) API.
* Support for generic blocks of sparse matrices.
* Add conservative resize feature on sparse matrices.
* Add uniform support for solving sparse systems with sparse right hand sides.
* Support to external libraries
* New [MetisSupport](http://eigen.tuxfamily.org/dox-devel/group__MetisSupport__Module.html) module: wrapper to the famous graph partitioning library.
* New [SPQRSupport](http://eigen.tuxfamily.org/dox-devel/group__SPQRSupport__Module.html) module: wrapper to suitesparse's supernodal QR solver.
* Misc
* Improved presentation and clarity of Doxygen generated documentation (modules are now organized into chapters, treeview panel and search engine for quick navagitation).
* New compilation token `EIGEN_INITIALIZE_MATRICES_BY_NAN` to help debugging.
* All bug fixes of the 3.1 branch, plus a couple of other fixes (including 211, 479, 496, 508, 552)
* **New set of officially supported Sparse Modules**
** This includes sparse matrix storage, assembly, and many built-in (Cholesky, CG, BiCGSTAB, ILU), and third-party (PaStiX, Cholmod, UmfPack, SuperLU, Pardiso) solvers
** See this [page](http://eigen.tuxfamily.org/dox-devel/TutorialSparse.html) for an overview of the features
* **Optional support for Intel MKL**
** This includes the BLAS, LAPACK, VML, and Pardiso components
** See this [page](http://eigen.tuxfamily.org/dox-devel/TopicUsingIntelMKL.html) for the details
* Core
** New vector-wise operators: `*`, `/`, `*=`, `/=`
** New coefficient-wise operators: `&&`, `||`, `min(Scalar)`, `max(Scalar)`, `pow`, `operator/(Scalar,ArrayBase)`
* Decompositions
** Add incremental rank-updates in LLTand LDLT
** New `SelfAdjointEigenSolver::computeDirect()` function for fast eigen-decomposition through closed-form formulas (only for 2x2 and 3x3 real matrices)
* Optimizations
* Memory optimizations in JacobiSVD and triangular solves.
* Optimization of reductions via partial unrolling (e.g., dot, sum, norm, etc.)
* Improved performance of small matrix-matrix products and some Transform<> operations
Eigen 3.1 represents about 600 commits since Eigen 3.0.
*#466: fix a possible race condition issue. from now, multithreaded applications that call Eigen from multiple thread must initialize Eigen by calling `initParallel()`.
* For consistency, `SimplicialLLT` and `SimplicialLDLT` now factorizes `P A P^-1` (instead of `P^-1 A P`).
*#475: now the vectorized `exp` operator returns +inf when overflow occurs
* Fix the use of MKL with MSVC by disabling MKL's pow functions.
* Avoid dynamic allocation for fixed size triangular solving
* Officially supported set of sparse modules. See this [page](http://eigen.tuxfamily.org/dox-devel/TutorialSparse.html) for an overview of the features. Main changes:
* new `SparseCore` module equivalent to the old `Sparse` module, the `Sparse` module is now a super module including all sparse-related modules
* the `SparseMatrix` class is now more versatile and supports an uncompressed mode for fast element insertion
* the `SparseMatrix` class now offer a unique and simplified API to insert elements
*`DynamicSparseMatrix` has been deprecated (moved into `unsupported/SparseExtra`)
* new conservative `sparse * sparse` matrix product which is also used by default
* new `SparseCholesky` module featuring the SimplicialLLT and SimplicialLDLT built-in solvers
* new `IterativeLinearSolvers` module featuring a conjugate gradient and stabilized bi-conjugate gradient iterative solvers with a basic Jacobi preconditioner
* New `SelfAdjointEigenSolver::computeDirect()` function for fast eigen-decomposition through closed-form formulas (only for 2x2 and 3x3 real matrices)
* New `LLT::rankUpdate()` function supporting both updates and down-dates
* Optimization of reduction via partial unrolling (e.g., dot, sum, norm, etc.)
* New coefficient-wise operators: `&&` and `||`
* Feature #157 - New vector-wise operations for arrays: `*`, `/`, `*=`, and `/=`.
* Feature #206 - Pre-allocation of intermediate buffers in JacobiSVD
* Feature #370 - New typedefs for AlignedBox
* All the fixes and improvements of the 3.0 branch up to the 3.0.4 release (see below)
* Core: added new `EIGEN_RUNTIME_NO_MALLOC` option and new `set_is_malloc_allowed()` option to finely control where dynamic memory allocation is allowed. Useful for unit-testing of functions that must not cause dynamic memory allocations.
* Core: SSE performance fixes (follow-up from #203).
* Core: Fixed crashes when using `EIGEN_DONT_ALIGN` or `EIGEN_DONT_ALIGN_STATICALLY` (#213 and friends).
* Core: `EIGEN_DONT_ALIGN` and `EIGEN_DONT_ALIGN_STATICALLY` are now covered by unit tests.
* Geometry: allow to pass Options parameters to Transform, Quaternion and other templates, to control memory alignment
* QR: add threshold API to FullPivHouseholderQR
* Core: added tan function
* Const correctness:
* Eigen now properly enforces const-correctness everywhere, for example with Map objects. This will break compilation of code that relied on former behavior.
* A new kind of test suite was added to check that, 'failtest'.
* BLAS/LAPACK:
* Complete BLAS library built on top of Eigen. Imported BLAS test suite, which allowed to fix many issues.
* Partial LAPACK implementation. Passing part of the LAPACK test suite, which also allowed to fix some issues.
* Eigen 2 Support:
* tons of improvements in `EIGEN2_SUPPORT`
* new incremental migration path: see http://eigen.tuxfamily.org/dox-devel/Eigen2SupportModes.html
* imported a copy of the Eigen 2 test suite, made sure that Eigen 3 passes it. That also allowed to fix several issues.
* Add support for the vectorization of `std::complex<>` with SSE, AltiVec and NEON.
* Add support for mixed `real * complex` matrix products with vectorization.
* Finalize the JacobiSVD class with: compile time options, thin/full decompositions, and least-square solving.
* Several improvement of the Transform class. In particular, there is no default mode anymore.
* New methods: `middleRows()`, `middleCols()`, `TriangularMatrix::conjugate()`
* New unsupported modules: OpenGL, MPFR C++
* Many improvements in the support of empty objects.
* Many improvements of the vectorization logic.
* Add the possibility to extend QuaternionBase.
* Vectorize Quaternion multiplication with double.
* Significant improvements of the documentation.
* Improved compile time errors.
* Enforce static allocation of temporary buffers in gemm (when possible).
* Fix aligned_delete for null pointers and non trivial dtors.
* Fix eigen decomposition of 3x3 float matrices.
* Fix 4x4 matrix inversions (vectorization).
* Many fixes in QR: solving with `m>n`, use of rank, etc.
* Fixes for MSVC for windows mobile and CLang.
* Remove the Taucs backend (obsolete).
* Remove the old SVD class (was causing too much troubles, a new decompozition based on bidiagonalisation/householder should come back soon, `JacobiSVD` can be used meanwhile).
* Fix #141: crash in SSE (alignment problem) when using dynamic-size matrices with a max-size fixed at compile time that is not a multiple of 16 bytes. For example, `Matrix<double,Dynamic,Dynamic,AutoAlign,5,5>`.
* Fix #142: LU of fixed-size matrices was causing dynamic memory allocation (patch by Stuart Glaser).
* Fix #132: crash in certain matrix-vector products. Unit test added.
* Fix #125: colwise `norm()` and `squaredNorm()` on complex types do not return real types
* Fully support the QCC/QNX compiler (thanks to Piotr Trojanek). The support in 2.0.12 was incomplete. The whole test suite is now successful.
* As part of the QCC support work, a lot of standards compliance work: put `std::` in front of a lot of things such as `size_t`, check whether the math library needs to be linked to explicitly.
* Fix precision issues in LDLT. The `isPositiveDefinite()` method is now always returning true, but it was conceptually broken anyway, since a non-pivoting LDLT decomposition can't know that.
* Compilation fix in `ldlt()` on expressions.
* Actually install the Eigen/Eigen and Eigen/Dense public headers!
*`EIGEN_DEFAULT_TO_ROW_MAJOR` is fully supported and tested.
* Several important fixes for row-major matrices.
* Fix support of several algorithms for mixed fixed-dynamic size matrices where the fixed dimension is greater than the dynamic dimension. For example: `Matrix<float,3,Dynamic>(3,2)`
* fix `EIGEN_DONT_ALIGN`: now it _really_ disables vectorization (was giving a `#error` unless you also used `EIGEN_DONT_VECTORIZE`).
* Fix #92: Support QNX's QCC compiler (patch by Piotr Trojanek)
* Fix #90, missing type cast in LU, allow to use LU with MPFR (patch by 'Wolf').
* Fix ICC compiler support: work around a bug present at least in ICC 11.1.
* Compilation fixes for `computeInverse()` on expressions.
* Fix a gap in a unit-test (thanks to Jitse Niesen)
* Rewrite 4x4 matrix inverse to improve precision, and add a new unit test to guarantee that precision. It's less fast, but it's still faster than the cofactors method.
* Fix bug #62: crash in SSE code with MSVC 2008 (Thanks to Hauke Heibel).
* Fix bug #65:`MatrixBase::nonZeros()` was recursing infinitely
* Fix PowerPC platform detection on Mac OSX.
* Prevent the construction of bogus MatrixBase objects and generate good compilation errors for that. Done by making the default constructor protected, and adding some private constructors.
* Add option to initialize all matrices by zero: just #define`EIGEN_INITIALIZE_MATRICES_BY_ZERO`
* Improve Map documentation
* Install the pkg-config file to share/pkgconfig, instead of lib/pkgconfig (thanks to Thomas Capricelli)
* fix installation error introduced in 2.0.7: it was choking on the pkg-config file eigen2.pc not being found. The fix had been proposed long ago by Ingmar Vanhassel for the development branch, and when recently the pkg-config support was back-ported to the 2.0 branch, nobody thought of backporting this fix too, and apparently nobody tested "make install" !
* SVD: add default constructor. Users were relying on the compiler to generate one, and apparenty 2.0.7 triggered a little MSVC 2008 subtlety in this respect. Also added an assert.
* fix bug #61: crash when using Qt `QVector` on Windows 32-bit. By Hauke Heibel.
* fix bug #10: the `reallocateSparse` function was half coded
* fix bug in `SparseMatrix::resize()` not correctly initializing by zero
* fix another bug in `SparseMatrix::resize()` when `outerSize==0`. By Hauke Heibel.
* fully support GCC 3.3. It was working in 2.0.2, there was a compilation error in 2.0.6, now for the first time in 2.0.7 it's 100% tested (the test suite passes without any errors, warnings, or failed tests).
* SVD: add missing assert (help catch mistakes)
* fixed warnings in unit-tests (Hauke Heibel)
* finish syncing `Memory.h` with the devel branch. This is cleaner and fixes a warning. The choice of system aligned malloc function may be affected by this change.
* add pkg-config support by Rhys Ulerich.
* documentation fix and doc-generation-script updates by Thomas Capricelli
* fix bug #42: Add `Transform::Identity()` as mentioned in the tutorial.
* allow to disable all alignment code by defining `EIGEN_DONT_ALIGN` (backport from devel branch).
* backport the devel branch's `StdVector` header as `NewStdVector`. You may also #define`EIGEN_USE_NEW_STDVECTOR` to make `StdVector` use it automatically. However, by default it isn't used by `StdVector`, to preserve compatibility.
* Vectorized quaternion product (for float) by Rohit Garg (backport from devel branch).
* allow to override `EIGEN_RESTRICT` and add `EIGEN_DONT_USE_RESTRICT_KEYWORD`
* fix a warning in `ei_aligned_malloc`; fixed by backporting the body from the devel branch; may result in a different choice of system aligned malloc function.