# Usage

To use xtensor-blas functions, the `xlinalg.hpp` header has to be included. In the `xt::linalg` namespace, many of NumPy’s `np.linalg` functions are implemented. We make an effort to keep the interfaces very similar.

For example, calculating a determinant:

    #include "xtensor-blas/xlinalg.hpp"

    int main()
    {
        xt::xarray<double> a = {{3, 2, 1}, {0, 4, 2}, {1, 3, 5}};
        auto d = xt::linalg::det(a);
        std::cout << d << std::endl;  // 42.0
    }

We can also try to compute the same determinant using the `slogdet` function, which is more robust against under- or overflows by summing up the logarithm. The slogdet function in NumPy returns a tuple of (sign, val). In C++, we emulate the behaviour by returning a `std::tuple`, which can be unpacked using `std::get<N>(tuple)`.

    xt::xarray<double> a = {{3, 2, 1}, {0, 4, 2}, {1, 3, 5}};
    auto d = xt::linalg::slogdet(a);
    std::cout << std::get<0>(d) << ", " << std::get<1>(d) << std::endl;  // +1, 3.7376696

Returning tuples is used throughout the xlinalg package.

## Using xblas and xlapack directly

It is not necessarily recommended to use `xblas` or `xlapack` directly, but it’s possible and can improve performance in certain cases. Some things have to be taken into consideration: For one thing, the result container needs to be allocated and passed into the function beforehand. And for the LAPACK functions, all arguments have to be in column_major order. Furthermore it’s required that the xexpressions are evaluated and are stored in contiguous memory. All of this is taken care of when using `xlinalg`.