# d_mat.h – double precision matrices

## Memory management

void d_mat_init(d_mat_t mat, slong rows, slong cols)

  Initialises a matrix with the given number of rows and columns for use.

void d_mat_clear(d_mat_t mat)

  Clears the given matrix.

## Basic assignment and manipulation

void d_mat_set(d_mat_t mat1, const d_mat_t mat2)

  Sets `mat1` to a copy of `mat2`. The dimensions of `mat1` and `mat2` must be the same.

void d_mat_swap_entrywise(d_mat_t mat1, d_mat_t mat2)

  Swaps two matrices by swapping the individual entries rather than swapping the contents of the structs.

double d_mat_entry(d_mat_t mat, slong i, slong j)

  Returns the entry of `mat` at row \(i\) and column \(j\). Both \(i\) and \(j\) must not exceed the dimensions of the matrix. This function is implemented as a macro.

double d_mat_get_entry(const d_mat_t mat, slong i, slong j)

  Returns the entry of `mat` at row \(i\) and column \(j\). Both \(i\) and \(j\) must not exceed the dimensions of the matrix.

double *d_mat_entry_ptr(const d_mat_t mat, slong i, slong j)

  Returns a pointer to the entry of `mat` at row \(i\) and column \(j\). Both \(i\) and \(j\) must not exceed the dimensions of the matrix.

void d_mat_zero(d_mat_t mat)

  Sets all entries of `mat` to 0.

## Random matrix generation

void d_mat_randtest(d_mat_t mat, flint_rand_t state, slong minexp, slong maxexp)

  Sets the entries of `mat` to random signed numbers with exponents between `minexp` and `maxexp` or zero.

## Input and output

void d_mat_print(const d_mat_t mat)

  Prints the given matrix to the stream `stdout`.

## Comparison

int d_mat_equal(const d_mat_t mat1, const d_mat_t mat2)

  Returns a non-zero value if `mat1` and `mat2` have the same dimensions and entries, and zero otherwise.

int d_mat_approx_equal(const d_mat_t mat1, const d_mat_t mat2, double eps)

  Returns a non-zero value if `mat1` and `mat2` have the same dimensions and entries within `eps` of each other, and zero otherwise.

int d_mat_is_square(const d_mat_t mat)

  Returns a non-zero value if the number of rows is equal to the number of columns in `mat`, and otherwise returns zero.

## Transpose

void d_mat_transpose(d_mat_t B, const d_mat_t A)

  Sets \(B\) to \(A^T\), the transpose of \(A\). Dimensions must be compatible. Aliasing is allowed for square matrices.

## Matrix multiplication

void d_mat_mul_classical(d_mat_t C, const d_mat_t A, const d_mat_t B)

  Sets `C` to the matrix product \(C = A B\). The matrices must have compatible dimensions for matrix multiplication (an exception is raised otherwise). Aliasing is allowed.