...one of the most highly
regarded and expertly designed C++ library projects in the
world.

— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards

uBLAS is a C++ template class library that provides BLAS level 1, 2, 3 functionality for dense, packed and sparse matrices. The design and implementation unify mathematical notation via operator overloading and efficient code generation via expression templates.

uBLAS provides templated C++ classes for dense, unit and sparse vectors, dense, identity, triangular, banded, symmetric, hermitian and sparse matrices. Views into vectors and matrices can be constructed via ranges, slices, adaptor classes and indirect arrays. The library covers the usual basic linear algebra operations on vectors and matrices: reductions like different norms, addition and subtraction of vectors and matrices and multiplication with a scalar, inner and outer products of vectors, matrix vector and matrix matrix products and triangular solver. The glue between containers, views and expression templated operations is a mostly STL conforming iterator interface.

Please consult the release notes for details on the latest changes.

- Overview
- Vector
- Sparse Vector
- Vector Proxies
- Vector Expressions
- Matrix
- Triangular Matrix
- Symmetric Matrix
- Hermitian Matrix
- Banded Matrix
- Sparse Matrix
- Matrix Proxies
- Matrix Expressions
- Storage and special containers
- Sparse Storage
- Operations & Functions
- uBLAS Concept definitions

The current version of uBLAS expects a modern (ISO standard compliant) compiler. Compilers targeted and tested with this release are:

- GCC 3.2.3, 3.3.x, 3.4.x, 4.0.x
- MSVC 7.1, 8.0
- ICC 8.0, 8.1
- Visual age 6
- Codewarrior 9.4, 9.5

The version of uBLAS in Boost 1.32.0 (and earlier) support many older compilers. If you are using such a compiler please use this version of uBLAS. Compilers known to accept this older library are:

- MSVC 6.0 with STLPort-4.5.3, 7.0, 7.1
- GCC 2.95.x, 3.0.x, 3.1.x, 3.2.x, 3.3.x, 3.4.x
- ICC 7.0, 7.1 8.0
- Comeau 4.2.x
- Codewarrior 8.3

For possible problems please consider to consult the Boost regression tests.

- The implementation assumes a linear memory address model.
- Tuning was focussed on dense matrices.

The latest stable release of uBLAS is part of the Boost libraries.

Visit the Effective uBLAS wiki for up to date information and contributions.

There is also an active uBLAS mailing list where uBLAS specific user and development questions are answered.

There is also an active uBLAS mailing list where uBLAS specific from the latest uBLAS project code. You can view the Boost CVS archive directly. You will find the library here. Documentation and test programs reside here.

uBLAS initially was written by Joerg Walter and Mathias Koch. We would like to thank all, which supported and contributed to the development of this library: David Abrahams, Ed Brey, Fernando Cacciola, Juan Jose Gomez Cadenas, Beman Dawes, Matt Davies, Bob Fletcher, Kresimir Fresl, Joachim Kessel, Patrick Kowalzick, Toon Knapen, Hendrik Kueck, John Maddock, Jens Maurer, Alexei Novakov, Gary Powell, Joachim Pyras, Peter Schmitteckert, Jeremy Siek, Markus Steffl, Michael Stevens, Benedikt Weber, Martin Weiser, Gunter Winkler, Marc Zimmermann, David Bellot, Marco Guazzone, Nasos Iliopoulus, the members of Boost and all others contributors around the world. I promise I will try to add their names to this list.

Q: Should I use uBLAS for new projects?

A: At the time of writing (09/2012) there are a lot of good matrix libraries available, e.g.,
MTL4,
armadillo,
eigen. uBLAS offers a stable, well tested set of vector and
matrix classes, the typical operations for linear algebra and solvers for triangular systems of equations. uBLAS offers
dense, structured and sparse matrices - all using similar interfaces. And finally uBLAS offers good (but not outstanding)
performance. On the other side, the last major improvement of uBLAS was in 2008 and no significant change was committed
since 2009. So one should ask himself some questions to aid the decision: *Availability?* uBLAS is part of boost
and thus available in many environments. *Easy to use?* uBLAS is easy to use for simple things, but needs decent
C++ knowledge when you leave the path. *Performance?* There are faster alternatives. *Cutting edge?* uBLAS
is more than 10 years old and missed all new stuff from C++11.

Q: I'm running the uBLAS dense vector and matrix benchmarks. Why do I see a significant performance difference
between the native C and library implementations?

A: uBLAS distinguishes debug mode (size and type conformance checks enabled, expression templates disabled) and release
mode (size and type conformance checks disabled, expression templates enabled). Please check, if the preprocessor
symbol `NDEBUG`

of `cassert`

is defined. `NDEBUG`

enables release mode, which in turn
uses expression templates. You can optionally define `BOOST_UBLAS_NDEBUG`

to disable all bounds, structure
and similar checks of uBLAS.

Q: I've written some uBLAS tests, which try to incorrectly assign different matrix types or overrun vector and
matrix dimensions. Why don't I get a compile time or runtime diagnostic?

A: uBLAS distinguishes debug mode (size and type conformance checks enabled, expression templates disabled) and release
mode (size and type conformance checks disabled, expression templates enabled). Please check, if the preprocessor
symbol `NDEBUG`

of `cassert`

is defined. `NDEBUG`

disables debug mode, which is needed
to get size and type conformance checks.

Q: I've written some uBLAS benchmarks to measure the performance of matrix chain multiplications like ```
prod (A,
prod (B, C))
```

and see a significant performance penalty due to the use of expression templates. How can I disable
expression templates?

A: You do not need to disable expression templates. Please try reintroducing temporaries using either ```
prod
(A,
```

*matrix_type*`(prod (B, C)))`

or ```
prod (A,
prod<
```

*matrix_type*`> (B, C))`

.

Copyright (©) 2000-2010 Joerg Walter, Mathias Koch, Gunter Winkler, David Bellot

Use, modification and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file
LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
).