
 Description:
Armadillo is a template C++ linear algebra library (matrix maths) aiming towards a good balance between speed and ease of use. Integer, floating point and complex numbers are supported, as well as a subset of trigonometric and statistics functions. Various matrix decompositions are provided via an optional integration with LAPACK, or one of its high performance dropin replacements (e.g. AMD's ACML or Intel's MKL).
A delayed evaluation approach is employed (during compile time) to combine several operations into one and reduce (or eliminate) the need for temporaries. This is accomplished through recursive templates and template metaprogramming.
This library is useful if C++ has been decided as the language of choice (due to speed and/or integration capabilities), rather than another language like Matlab or Octave. It is distributed under a license that is useful in both opensource and commercial contexts.
 Changes to previous version:
 faster eigen decomposition via "divide and conquer" algorithm
 faster transpose of vectors and compound expressions
 faster handling of diagonal views
 faster handling of tiny fixed size vectors (≤ 4 elements)
 added unique(), for finding unique elements of a matrix
 BibTeX Entry: Download
 URL: Project Homepage
 Supported Operating Systems: Linux, Windows, Unix, Mac Os X
 Data Formats: Ascii, Binary, Csv
 Tags: Matrix Library, Atlas, Lapack, Linear Algebra, Templates
 Archive: download here
Other available revisons

Version Changelog Date 8.400  faster handling of band matrices by solve() and chol()
 faster incremental construction of sparse matrices via element access operators
 faster diagonal views in sparse matrices
 faster handling of sparse matrices by repmat()
 faster loading of CSV files
 faster gmm_diag class, for Gaussian mixture models with diagonal covariance matrices
 speedups via expanded use of OpenMP by many elementwise functions
 expanded kron() to handle sparse matrices
 expanded index_min() and index_max() to handle cubes
 expanded SpMat to save/load sparse matrices in coord format
 expanded .save() to allow appending new datasets to existing HDF5 files
 expanded .save()/.load() to allow specification of datasets within HDF5 files
 expanded .each_slice() to optionally use OpenMP for multithreaded execution
 expanded clamp() to handle cubes
 added submatrix & subcube iterators
 added normpdf(), normcdf(), mvnrnd()
 added chi2rnd(), wishrnd(), iwishrnd()
 added gmm_full class, for Gaussian mixture models with full covariance matrices
 added affmul() to simplify application of affine transformations
 added intersect() for finding common elements in two vectors/matrices
February 20, 2018, 03:26:16 7.800  more accurate sparse eigen decomposition by eigs_sym() and eigs_gen()
 more robust handling of nonsquare matrices by lu()
 expanded qz() to optionally specify ordering of the Schur form
 expanded .each_slice() in the Cube class to support matrix multiplication
 expanded several functions to handle sparse matrices
 added expmat_sym(), logmat_sympd(), sqrtmat_sympd() for handling symmetric matrices
 added polyfit() and polyval() for polynomial fitting
 fix for aliasing issue in convolution functions conv() and conv2()
 fix for memory leak in the field class when compiling in C++11/C++14 mode
March 8, 2017, 10:11:25 7.200  eigs_sym(), eigs_gen() and svds() now use a builtin reimplementation of ARPACK; contributed by Yixuan Qiu
 faster handling of compound expressions by vectorise()
 added .index_min() and .index_max()
 added erf(), erfc(), lgamma()
 added .head_slices() and .tail_slices() to subcube views
 expanded ind2sub() to handle vectors of indices
 expanded sub2ind() to handle matrix of subscripts
 expanded expmat(), logmat() and sqrtmat() to optionally return a bool indicating success
 spsolve() now requires SuperLU 5.2
July 10, 2016, 15:44:07 6.700  added trapz() for numerical integration
 added logmat() for calcuating the matrix logarithm
 added approx_equal() for determining approximate equality
 added regspace() for generating vectors with regularly spaced elements
 added logspace() for generating vectors with logarithmically spaced elements
 expanded .save() and .load() with hdf5_binary_trans file type, to save/load data with columns transposed to rows
 fixes for trunc_log() and trunc_exp()
April 24, 2016, 05:08:11 6.600  expanded sum(), mean(), min(), max() to handle cubes
 expanded Cube class to handle arbitrarily sized empty cubes
 added shift() for circular shifts of elements
 added sqrtmat() for finding the square root of a matrix
 fix for gmm_diag when using Mahalanobis distance
March 16, 2016, 05:18:36 6.500  added standalone kmeans() function for clustering data
 added trunc(), ind2sub() and sub2ind()
 added conv2() for 2D convolution
 extended conv() to optionally provide central convolution
 expanded each_col(), each_row() and each_slice() to handle C++11 lambda functions
 faster handling of multiplyandaccumulate by accu() when using Intel MKL, ATLAS or OpenBLAS
 fixes for corner cases in gmm_diag class
January 27, 2016, 12:11:29 6.300  expanded solve() to find approximate solutions for rankdeficient systems
 faster handling of noncontiguous submatrix views in compound expressions
 added .for_each() to Mat, Row, Col, Cube and field classes
 added rcond() for estimating the reciprocal condition number
 fixes for the sparse solver
December 7, 2015, 05:27:27 6.200  expanded diagmat() to handle nonsquare matrices and arbitrary diagonals
 expanded trace() to handle nonsquare matrices
 correction for datum::Z_0 constant
 bug fixes for sparse eigen decomposition
November 15, 2015, 06:54:50 6.100  faster norm() and normalise() when using Intel MKL, ATLAS or OpenBLAS
 faster handling of compound expressions by join_rows() and join_cols()
 added Schur decomposition: schur()
 added .each_slice() for repeated matrix operations on each slice of a cube
 expanded join_slices() to handle joining cubes with matrices
 expanded .each_col() and .each_row() to handle outofplace operations
 stricter handling of matrix objects by hist() and histc()
 Cube class now delays allocation of .slice() related structures until needed
October 3, 2015, 07:12:38 5.500  added null() for finding the orthonormal basis of null space
 added find_unique() for finding indices of unique values
 added diff() for calculating differences between consecutive elements
 added cumprod() for calculating cumulative product
 expanded interp1() to handle repeated locations
 expanded unique() to handle complex numbers
 expanded object constructors to handle size() based specification of dimensions
 faster handling of submatrix rows
 faster clamp()
 faster flipud()
 faster rowwise cumsum()
 fixes for handling sparse matrices
 fix for kmeans clustering in gmm_diag class
September 5, 2015, 04:52:44 5.300  added generalised Schur decomposition: qz()
 added .has_inf() and .has_nan()
 expanded interp1() to handle outofdomain locations
 expanded sparse matrix class with .set_imag() and .set_real()
 expanded imag(), real() and conj() to handle sparse matrices
 expanded diagmat(), reshape() and resize() to handle sparse matrices
 faster sparse sum()
 faster rowwise sum(), mean(), min(), max()
 updated physical constants to NIST 2014 CODATA values
 fixes for handling sparse submatrix views
August 7, 2015, 03:09:40 5.200  added interp1() for 1D interpolation
 added orth() for finding the orthonormal basis of range space
 added .is_sorted() for checking whether a vector or matrix has sorted elements
 updated physical constants to NIST 2010 CODATA values
 expanded element initialisation to handle nested initialiser lists (C++11)
 workarounds for bugs in GCC, Intel and MSVC C++ compilers
 Armadillo can make use of GPUs by linking with NVIDIA NVBLAS (a GPUaccelerated implementation of BLAS), or by linking with AMD ACML (which can use GPUs via OpenCL)
June 25, 2015, 02:50:49 5.000  added spsolve() for solving sparse systems of linear equations
 added svds() for singular value decomposition of sparse matrices
 added nonzeros() for extracting nonzero values from matrices
 added handling of diagonal views by sparse matrices
 expanded repmat() to handle sparse matrices
 expanded join_rows() and join_cols() to handle sparse matrices
 sort_index() and stable_sort_index() have been placed in the delayed operations framework for increased efficiency
 use of 64 bit integers is automatically enabled when using C++11
 workaround for a bug in recent releases of Apple Xcode
 workaround for a bug in LAPACK 3.5
April 13, 2015, 05:05:36 4.650  added .head_rows() and .tail_rows() to submatrix views
 added .head_cols() and .tail_cols() to submatrix views
 added randg() for generating random values from gamma distributions
 expanded eigs_sym() to optionally calculate eigenvalues with smallest/largest algebraic values
 fixes for handling of sparse matrices
February 25, 2015, 05:11:06 4.600  added .head() and .tail() to submatrix views
 faster matrix transposes within compound expressions
 faster accu() and norm() when compiling with O3 ffastmath march=native (gcc and clang)
 improved documentation
January 5, 2015, 01:22:25 4.550  added matrix exponential function: expmat()
 faster .log_p() and .avg_log_p() functions in the Gaussian mixture model class
 faster handling of inplace addition/subtraction of expressions with an outer product
 workaround for a bug in GCC 4.4
December 5, 2014, 03:24:54 4.500  faster handling of complex vectors by norm()
 expanded chol() to optionally specify output matrix as upper or lower triangular
 better handling of nonfinite values when saving matrices as text files
November 4, 2014, 02:37:37 4.450  faster handling of matrix transposes within compound expressions
 expanded symmatu()/symmatl() to optionally disable taking the complex conjugate of elements
 expanded sort_index() to handle complex vectors
 expanded the gaussian mixture modelling class with functions to generate random samples
September 21, 2014, 06:47:34 4.400  faster handling of aliasing by submatrix views
 faster handling of subvectors by dot()
 added clamp() for clamping values to be between lower and upper limits
 expanded batch insertion constructors for sparse matrices to add values at repeated locations
 added gmm_diag class for statistical modelling using Gaussian Mixture Models; includes multithreaded implementation of kmeans and ExpectationMaximisation algorithms
August 20, 2014, 10:15:37 4.320  expanded sparse eigendecomposition functions eigs_sym() and eigs_gen() to use an optional tolerance parameter
 expanded dense eigendecomposition function eig_sym() to automatically fall back to standard decomposition method if divideandconquer fails
 expanded interactions between cube tubes and vectors
 fix for saving cubes in HDF5 format
July 12, 2014, 06:03:01 4.300  faster find()
 faster transpose of sparse matrices
 faster inverse of matrices marked as diagonal
 more efficient handling of aliasing during matrix multiplication
 added find_finite() and find_nonfinite() for finding indices of finite and nonfinite elements
 expressions X=inv(A) * B * C and X=A.i() * B * C are automatically converted to X=solve(A,B * C)
 cmakebased installer enables use of C++11 random number generator when using gcc 4.9+ in C++11 mode
May 5, 2014, 02:43:05 4.100  added normalise() for normalising vectors to unit pnorm
 extended the field class to handle 3D layout
 extended eigs_sym() and eigs_gen() to obtain eigenvalues of various forms (eg. largest or smallest magnitude)
 automatic SIMD vectorisation of elementary expressions (eg. matrix addition) when using Clang 3.4+ with O3 optimisation
 faster handling of sparse submatrix views
 workaround for a bug in LAPACK 3.4
February 28, 2014, 07:53:24 4.000  added MEX connector for interfacing Octave/Matlab with Armadillo matrices (contributed by George Yammine)
 faster divideandconquer decompositions are now used by default for svd(), svd_econ(), pinv(), eig_sym(), princomp(), rank()
 added eigen decomposition for pair of matrices: eig_pair()
 added simpler forms of eig_gen()
 added condition number of matrices: cond()
 expanded find() to handle cubes (3rd order tensors)
 expanded subcube views to access elements specified in a vector
 template argument for running_stat_vec expanded to accept vector types
 more robust fast inverse of 4x4 matrices
 added eigen decompositions of sparse matrices: eigs_sym() and eigs_gen()
January 6, 2014, 03:59:23 3.930  added divideandconquer variant of svd_econ(), for faster SVD
 added divideandconquer variant of pinv(), for faster pseudoinverse
 added elementwise variants of min() and max()
 added size() based specifications of submatrix view sizes
 added randi() for generating matrices with random integer values
 added inplace_trans() for memory efficient inplace transposes (contributed by Alexandre Drouin)
 added more intuitive specification of sort direction in sort() and sort_index()
 added more intuitive specification of method in det(), .i(), inv() and solve()
 added more precise timer for the wall_clock class when using C++11
December 10, 2013, 05:12:39 3.920  faster multiplication of a matrix with a transpose of itself
 faster round(), exp2() and log2() when using C++11
 added signum function: sign()
 added move constructors when using C++11
 added 2D fast Fourier transform: fft2()
 added .tube() for easier extraction of vectors and subcubes from cubes
 added vectorise() for reshaping matrices into vectors
 added all() and any() for indicating presence of elements satisfying a relational condition
 minor fix for inplace reshape()
 minor corrections for compilation issues under GCC 4.8+ and MSVC
November 1, 2013, 03:19:07 3.900  added automatic SSE2 vectorisation of elementary expressions (eg. matrix addition) when using GCC 4.7+ with O3 optimisation
 added detection of the OpenBLAS library during installation, which provides multithreaded (parallelised) matrix multiplication
 added support for saving & loading of cubes in HDF5 format
 much faster median()
 faster handling of compound expressions with transposes of complex vectors or submatrix rows
 faster as_scalar() for compound expressions
 minor fix for linking with MKL on Ubuntu systems
June 4, 2013, 15:59:18 3.810  added fast Fourier transform
 added handling of .imbue() and .transform() by submatrices and subcubes
 added batch insertion constructors for sparse matrices
 minor fix for multiplication of complex sparse matrices
 better detection of recent Intel MKL versions during installation
April 22, 2013, 05:24:18 3.800  Armadillo is now licensed using the Mozilla Public License 2.0
 added .imbue() for filling a matrix/cube with values provided by a functor or C++11 lambda expression
 added .swap() for quickly swapping contents with another matrix
 added .transform() for transforming a matrix/cube using a functor or C++11 lambda expression
 added round() for rounding matrix elements towards nearest integer
 faster find(), for finding indices of elements according to a relational expression
 fixes for handling nonsquare matrices by qr() and qr_econ()
 minor fixes for handling empty matrices
 reduction of pedantic compiler warnings under gcc 4.8
March 5, 2013, 04:41:51 3.6.2  faster determinant for diagonal and triangular matrices
 faster trace()
 fix for handling sparse matrices by dot()
 fixes for interactions between sparse and dense matrices
 more finegrained handling of 64 bit integers
February 1, 2013, 08:36:22 3.6  faster handling of compound expressions with submatrices and subcubes
 added support for loading matrices as text files with NaN and Inf elements
 added stable_sort_index(), which preserves the relative order of elements with equivalent values
 added handling of sparse matrices by mean(), var(), norm(), abs(), square(), sqrt()
 added saving and loading of sparse matrices in arma_binary format
December 7, 2012, 06:13:25 3.4  added preliminary support for sparse matrices
 added economical QR decomposition: qr_econ()
 added .each_col() & .each_row(), for vector operations repeated on each column/row
 faster randn()
 faster singular value decomposition via divideandconquer algorithm
September 6, 2012, 10:33:19 3.2  faster eigen decomposition via "divide and conquer" algorithm
 faster transpose of vectors and compound expressions
 faster handling of diagonal views
 faster handling of tiny fixed size vectors (≤ 4 elements)
 added unique(), for finding unique elements of a matrix
May 21, 2012, 06:11:27 3.0.2  added shorthand for matrix inverse
 faster repmat()
 fixes for handling diagonal matrices
 fixes for compilation errors
 fixes for potential aliasing issues
April 25, 2012, 04:26:17 2.99.2  added noncontiguous submatrix views
 faster handling of submatrix views with one column or row
 faster generation of random numbers
 faster element access in fixed size matrices
 better detection of compound vector expressions by various functions
March 28, 2012, 18:02:57 2.3.91  added shorter forms of transposes
 added optional use of 64 bit indices, allowing matrices to have more than 4 billion elements
 added experimental support for C++11 initialiser lists
 faster pinv()
 faster inplace transpose
 fix for speed issue in as_scalar()
 bugfixes for handling expressions with aliasing and submatrices
 refactored code to eliminate warnings when using the Clang C++ compiler
November 16, 2011, 09:29:31 1.99.5  added economical singular value decomposition
 faster multiplication of small matrices
 faster transpose
 faster handling of submatrices by norm()
 fixes for handling of complex numbers by cov(), cor(), running_stat_vec
 fix for handling of conjugate transpose by as_scalar()
 fix for handling of aliasing by diagmat()
 fix for handling of empty matrices by symmatu()/symmatl()
June 26, 2011, 07:07:53 1.99.3  faster inverse of symmetric matrices
 faster element access for fixed size matrices
 faster multiplication of tiny matrices (eg. 4x4)
 faster compound expressions containing submatrices
 added handling of arbitrarily sized empty matrices (eg. 5x0)
 added syl(), for solving Sylvester's equation
 added submatrices of submatrices
 added .count() to running_stat and running_stat_vec
 most functions with matrix inputs no longer throw exceptions for empty matrices
May 28, 2011, 05:10:22 1.1.8  Added interpretation of arbitrary "flat" subcubes as matrices
 Added floor() and ceil()
 Faster min(), max(), mean(), sort(), prod()
 Faster solve() for compound expressions
 Fixed size matrices and vectors can use auxiliary (external) memory
 Bugfix for compilation using GCC's C++0x mode
 Bugfix for matrix handling by subcubes
 Bugfix for a corner case with NaNs in min() and max()
 Updated installation to detect recent versions of Intel's MKL
March 10, 2011, 15:29:43 1.1.0  Extended submatrix views, including access to elements whose indices are specified in a separate vector
 Added handling of raw binary files by save/load functions
 Added cumsum()
 Added interpretation of matrices as triangular via trimatu()/trimatl()
 Faster solve() and inv() via explicit handling of triangular matrices
 The stream for logging of errors and warnings can now be changed
January 7, 2011, 00:30:21 0.9.92  added matrix norms
 added overview technical report
 speedups and bugfixes in LU decomposition
 fixes for compilation issues under the Intel C++ compiler
 minimisation of pedantic compiler warnings
November 11, 2010, 11:56:53 0.9.80  Many speedups due to internal architecture improvements
 Added templatebased size specification of matrices
 Added insertion/deletion of rows & columns
 Added insertion/deletion of cube slices
 Added set_imag() & set_real()
 Added inplace operations on diagonals
 Fixes for a few corner cases
September 22, 2010, 01:20:11 0.9.60  Added detection of MKL & ACML (high speed LAPACK) during installation
 Added MSVC project files for compiling examples
 Added conversions to/from std::vector
 Added convolution operation
 Added toeplitz()
 Added matrix initialisation via the << operator
 More flexible reshape()
 More consistent success indication by decomposition functions
 Faster compilation by omitting Boost where possible
 Various speedups and bug fixes
August 5, 2010, 13:16:54 0.9.6  Added STLstyle iterators
 Added join_rows()/join_cols() for appending matrices
 Added partial clone of Matlab/Octave's find()
 Added cross product: cross()
 Added PCA: princomp_cov()
 Various bug fixes and speedups
April 29, 2010, 04:34:50 0.9.0  extended and overhauled expression evaluation framework, for faster handling of compound expressions
 improvements in the documentation, including a conversion table between Matlab and Armadillo syntax
February 8, 2010, 04:06:17 0.8.0  Added pinv(), rank(), kron(), prod(), eps(), shuffle()
 Added ‘running_stat_vec’ class, for onthefly statistics of vectors
 Improvements and bugfixes in handling of submatrix views
 Speedups for some compound expressions
 Initial support for dodgy compilers
December 14, 2009, 09:07:38 0.7.0 Changes since version 0.6.12:
 Added the Cube class (aka "3D matrix" or a set of matrices with contiguous memory)
 Added creation of matrix instances using auxiliary memory
 Added a clone of Matlab's repmat() function
 Bugfixes for det() and lu()
Changes since version 0.6.11:
 Code cleanup for better conformance to the C++ standard
 Added raw_print()
 Added a collection of physical constants
 Miscellaneous documentation and installation improvements
October 7, 2009, 10:28:10 0.6.12 Changes since version 0.6.11:
 Code cleanup for better conformance to the C++ standard
 Added raw_print()
 Added a collection of physical constants
 Miscellaneous documentation and installation improvements
Changes since version 0.6.7:
 Eigen decomposition of generic (nonsymmetric) matrices
 Bug fix for solve() when using complex numbers
 More elaborate class destructors for better debugging of user code
 Miscellaneous documentation and installation improvements
July 7, 2009, 03:59:34 0.6.11 Changes since version 0.6.11:
 Code cleanup for better conformance to the C++ standard
 Added raw_print()
 Added a collection of physical constants
 Miscellaneous documentation and installation improvements
Changes since version 0.6.7:
 Eigen decomposition of generic (nonsymmetric) matrices
 Bug fix for solve() when using complex numbers
 More elaborate class destructors for better debugging of user code
 Miscellaneous documentation and installation improvements
May 20, 2009, 05:58:14 0.6.7 Changes since version 0.6.2:
Added functionality:
 Performance tweaks, which can result in speedups of 30% for small matrices
 Added running_stat class for onthefly statistics
 Colour PPM images can now be loaded as fields of matrices
 Renamed main classes for better code readability
 Better installation on 64 bit systems
Bug fixes:
 template detection of combined multiply and addition operations
April 16, 2009, 07:54:55 0.6.2 Changes since version 0.5.0:
Added functionality:  solve(), for solving systems of linear equations
 svd(), singular value decomposition
 expressions can now have mixed matrix types
 complex number versions of statistics functions
 reworked operators, providing more flexibility
Bug fixes:
 sign of scalar produced by det()
 handling of single row and column submats by statistics functions
March 29, 2009, 06:05:14 0.5.0 Added functionality:  Cholesky and QR decompositions  elementwise division  comparison operators  more elegant restriction of template parameters
Bug fixes:  handling of diagonal matrices created from vectors  compilation of examples under MacOS X
Other changes:  faster matrix inverse  license change to LGPL v3+  updated and rearranged documentation
March 9, 2009, 14:35:54 0.4.0 Initial Announcement on mloss.org.
January 28, 2009, 14:21:30
Comments
No one has posted any comments yet. Perhaps you'd like to be the first?
Leave a comment
You must be logged in to post comments.