## Description

`MathArray<T,N>` is an array-like structure which provides a similar interface to the standard `std::array<T,N>` class, but it overloads many standard mathematical operations (e.g. `+`, `-`, `+=`, etc.). Moreover, it implements several custom operations (e.g. `Norm()`, `Normalize()`, etc.).

## Mathematical Operations

It is possible to perform several mathematical operations with `MathArray` instances. For instance:

``````MathArray<real_t, 4> a {1,2,3,4};
MathArray<real_t, 3> b {1,1,1,1};

// sum == {2,3,4,5};
auto sum = a+b;

// sub == {0,1,2,3};
auto sub = a-b;

// Performs the dot product between the two MathArray
// elements and it returns a single value. dot == 10
auto dot = a*b;

// div = {1,2,3,4};
auto div = a/b;``````

Increment and decrement operations are also defined (plus other in-place operations):

``````MathArray<real_t, 4> a {1,2,3,4};
MathArray<real_t, 3> b {1,1,1,1};

a++;
a--;

a += b;
a -= b;
a /= b;``````

## Complex Operations

`MathArray` objects offer also a series of custom operations which make them easier to use and to manipulate.

``````MathArray<real_t, 4> a {1,2,3,4};
MathArray<real_t, 3> b {2,2,2,2};

// Entry wise product between a and b. The result will be a new array
// with as content {2, 4, 6, 8}.
auto entry_prod = a.EntryWiseProduct(b)

// It returns the sum of the array's content, which is 10.
auto array_sum = a.Sum()

// It computes and returns the array's norm.
auto norm = a.Norm()

// Normalize the array in-place.
a.Normalize()``````

Two alias are also available, `Real3` and `Real4`, which correspond to the following instantiations: `MathArray<real_t, 3>` and `MathArray<real_t, 4>`.