views:

572

answers:

2

Hello, I am looking for a good (in the best case actively maintained) C++ matrix library. Thereby it should be templated, because I want to use a complex of rationals as numerical type. The matrices what I am dealing with are mainly sparse and unitary.

Can you please suggest libraries and also give a small explaination why to use them, because I know how to find them, but I cannot really decide what is suitable for me because I am missing the experience with them.

EDIT:

The main operations I am dealing with are matrix multiplication, scalar multiplication with a vector and kronecker product. The size of the matrices is exponential and I wanna at least be able to deal with matrices up to 1024x1024 entries.

+3  A: 

Boost uBLAS, because it's passed the Boost filter.

There are a few template libs that support sparse matrices, so it's really hard to come up with a better rationale if you're not more specific about your needs.

Manuel
+2  A: 

Many people doing "serious" matrix stuff, rely on BLAS, adding LaPack / ATLAS (normal matrices) or UMFPACK (sparse matrices) for more advanced math. The reason is that this code is well-tested, stable, reliable, and quite fast. Furthermore, you can buy them directly from a vendor (e.g. Intel MKL) tuned towards your architecture, but also get them for free. uBLAS mentioned in Manuel's answer is probably the standard C++ wrapper around BLAS. And if you need something like LaPack later on, there are bindings to do so.

However, none of these classes ticks your box for being templated and easy to use. Actually, I must admit, that I tend to call the C / Fortran interface directly when I use a BLAS / LaPack implementation, since I don't see much advantage in the C++ wrapper.

If I a need a simple-to-use, general-purpose C++ matrix library, I tend to use Eigen (I used to use NewMat in the past). Advantages:

  • quite fast on Intel architecture, probably the fastest for smaller matrices
  • nice interface
  • almost everything you expect from a matrix library
  • you can easily add new types

Disadvantages (IMO):

  • single-processor
  • slower for larger matrices and some advanced math than ATLAS (e.g. LU decomposition)
  • only experimental support for sparse matrices.
stephan
One obvious advantage of a C++ wrapper is the performance gain provided by expression templates
Manuel
@Manuel: agree. Avoiding temps is the main promise of matrix template libraries like http://www.oonumerics.org/blitz/, http://www.osl.iu.edu/research/mtl/, etc. But you can do most of this in C code, too, since BLAS routines do not copy matrices but work in-place where possible.
stephan
@stephan - you can spare some temporaries by doing everything in place but there are other things that expression templates optimize. For example, in a C library if you do add(A, add(B, add(C, D))) then the intermediate results must be computed, and each step involves a loop, so in total you have 3 loops. With expression templates the result is only evaluated once: 1 loop.
Manuel
@Manuel: agree again and learned something :-) My comment was probably biased too much against matrix template libraries due to my typical use-case
stephan