# Linear Algebra Libraries supported by H5CPP

HDF5 CPP is to simplify object persistence by implementing **CREATE,READ,WRITE,APPEND** operations on **fixed** or **variable length** N dimensional arrays. This header only implementation supports raw pointers | armadillo | eigen3 | blaze | blitz++ | it++ | dlib | uBlas | [std::vector][1] by directly operating on the underlying data-store, avoiding intermediate/temporary memory allocations. The api [is doxygen documented][202], furnished with an optional h5cpp compiler for POD struct support, detailed examples, as well as profiled.

# Storage Layout: Row / Column ordering

H5CPP guarantees zero copy, platform and system independent correct behaviour between supported linear algebra Matrices. In linear algebra the de-facto standard is column major ordering which is same Fortran uses for array layout. However this is changing and many of the above systems support row-major ordering or provide only support for it. To add insult to injury HDF5 container has C layout, which leads to: 'What do I have to do if I am reading a Matlab/Julia/R hdf5 matrix or cube into a row major ordered Eigen Matrix?.

Answer: H5CPP auto transpose takes care of the details by transposing Column Major Matrices during serialization so the persisting object is always an Row Major order. To fix this, you'd have to transpose M matrix, with a naive implementation and a huge dataset you'd be in trouble. Luckily this operation in H5CPP has no additional computational cost, no loss of bandwidth either thanks to chunk/block storage system: only the coordinates of the chunks are swapped, resulting in ZERO COPY operation.