-
- Description:
Armadillo is a high quality C++ library for linear algebra & scientific computing, aiming towards a good balance between speed and ease of use.
Useful for algorithm development directly in C++, or quick conversion of research code into production environments (eg. software & hardware products).
Provides high-level syntax (API) deliberately similar to MATLAB.
Provides efficient classes for vectors, matrices and cubes, as well as 200+ associated functions; integer, floating point and complex numbers are supported.
Various matrix decompositions are provided through integration with LAPACK, or one of its high performance drop-in replacements (eg. multi-threaded Intel MKL or OpenBLAS).
A sophisticated expression evaluator (based on template meta-programming) automatically combines several operations to increase speed and efficiency.
Primarily developed by Conrad Sanderson, with contributions from around the world.
- Changes to previous version:
- faster handling of sparse matrices by kron() and repmat()
- faster transpose of sparse matrices
- faster element access in sparse matrices
- faster row iterators for sparse matrices
- faster handling of compound expressions by trace()
- more efficient handling of aliasing in submatrix views
- expanded normalise() to handle sparse matrices
- expanded .transform() and .for_each() to handle sparse matrices
- added reverse() for reversing order of elements
- added repelem() for replicating elements
- added roots() for finding the roots of a polynomial
Other available revisons
-
Version Changelog Date 8.500 - faster handling of sparse matrices by kron() and repmat()
- faster transpose of sparse matrices
- faster element access in sparse matrices
- faster row iterators for sparse matrices
- faster handling of compound expressions by trace()
- more efficient handling of aliasing in submatrix views
- expanded normalise() to handle sparse matrices
- expanded .transform() and .for_each() to handle sparse matrices
- added reverse() for reversing order of elements
- added repelem() for replicating elements
- added roots() for finding the roots of a polynomial
April 23, 2018, 17:29:44 8.400 - faster handling of sparse matrices by kron() and repmat()
- faster transpose of sparse matrices
- faster element access in sparse matrices
- faster row iterators for sparse matrices
- faster handling of compound expressions by trace()
- more efficient handling of aliasing in submatrix views
- expanded normalise() to handle sparse matrices
- expanded .transform() and .for_each() to handle sparse matrices
- added reverse() for reversing order of elements
- added repelem() for replicating elements
- added roots() for finding the roots of a polynomial
February 20, 2018, 03:26:16 7.800 - more accurate sparse eigen decomposition by eigs_sym() and eigs_gen()
- more robust handling of non-square 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 built-in 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 stand-alone 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 multiply-and-accumulate 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 rank-deficient systems
- faster handling of non-contiguous 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 non-square matrices and arbitrary diagonals
- expanded trace() to handle non-square 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 out-of-place 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 row-wise cumsum()
- fixes for handling sparse matrices
- fix for k-means 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 out-of-domain 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 row-wise 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 GPU-accelerated 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 non-zero 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 -ffast-math -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 in-place 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 non-finite 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 multi-threaded implementation of k-means and Expectation-Maximisation algorithms
August 20, 2014, 10:15:37 4.320 - expanded sparse eigen-decomposition functions eigs_sym() and eigs_gen() to use an optional tolerance parameter
- expanded dense eigen-decomposition function eig_sym() to automatically fall back to standard decomposition method if divide-and-conquer 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 non-finite elements
- expressions X=inv(A) * B * C and X=A.i() * B * C are automatically converted to X=solve(A,B * C)
- cmake-based 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 p-norm
- 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 divide-and-conquer 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 divide-and-conquer variant of svd_econ(), for faster SVD
- added divide-and-conquer variant of pinv(), for faster pseudo-inverse
- added element-wise 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 in-place 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 multi-threaded (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 non-square 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 fine-grained 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 divide-and-conquer 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 non-contiguous 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 template-based size specification of matrices
- Added insertion/deletion of rows & columns
- Added insertion/deletion of cube slices
- Added set_imag() & set_real()
- Added in-place 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 STL-style 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 on-the-fly 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 (non-symmetric) 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 (non-symmetric) 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 on-the-fly 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 - element-wise 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 re-arranged 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.