# mpf_mat.h – matrices of MPF floating-point numbers¶

## Memory management¶

void mpf_mat_init(mpf_mat_t mat, slong rows, slong cols, flint_bitcnt_t prec)

Initialises a matrix with the given number of rows and columns and the given precision for use. The precision is at least the precision of the entries.

void mpf_mat_clear(mpf_mat_t mat)

Clears the given matrix.

## Basic assignment and manipulation¶

void mpf_mat_set(mpf_mat_t mat1, const mpf_mat_t mat2)

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

void mpf_mat_swap(mpf_mat_t mat1, mpf_mat_t mat2)

Swaps two matrices. The dimensions of mat1 and mat2 are allowed to be different.

void mpf_mat_swap_entrywise(mpf_mat_t mat1, mpf_mat_t mat2)

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

mpf * mpf_mat_entry(const mpf_mat_t * mat, slong i, slong j)

Returns a reference to the entry of mat at row $$i$$ and column $$j$$. Both $$i$$ and $$j$$ must not exceed the dimensions of the matrix. The return value can be used to either retrieve or set the given entry.

void mpf_mat_zero(mpf_mat_t mat)

Sets all entries of mat to 0.

void mpf_mat_one(mpf_mat_t mat)

Sets mat to the unit matrix, having ones on the main diagonal and zeroes elsewhere. If mat is nonsquare, it is set to the truncation of a unit matrix.

## Random matrix generation¶

void mpf_mat_randtest(mpf_mat_t mat, flint_ranmpf_t state, flint_bitcnt_t bits)

Sets the entries of mat to random numbers in the interval $$[0, 1)$$ with bits significant bits in the mantissa or less if their precision is smaller.

## Input and output¶

void mpf_mat_print(const mpf_mat_t mat)

Prints the given matrix to the stream stdout.

## Comparison¶

int mpf_mat_equal(const mpf_mat_t mat1, const mpf_mat_t mat2)

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

int mpf_mat_approx_equal(const mpf_mat_t mat1, const mpf_mat_t mat2, flint_bitcnt_t bits)

Returns a non-zero value if mat1 and mat2 have the same dimensions and the first bits bits of their entries are equal, and zero otherwise.

int mpf_mat_is_zero(const mpf_mat_t mat)

Returns a non-zero value if all entries mat are zero, and otherwise returns zero.

int mpf_mat_is_empty(const mpf_mat_t mat)

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

int mpf_mat_is_square(const mpf_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.

## Matrix multiplication¶

void mpf_mat_mul(mpf_mat_t C, const mpf_mat_t A, const mpf_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.

## Gram-Schmidt Orthogonalisation and QR Decomposition¶

void mpf_mat_gso(mpf_mat_t B, const mpf_mat_t A)

Takes a subset of $$R^m$$ $$S = {a_1, a_2, \ldots ,a_n}$$ (as the columns of a $$m x n$$ matrix A) and generates an orthonormal set $$S' = {b_1, b_2, \ldots ,b_n}$$ (as the columns of the $$m x n$$ matrix B) that spans the same subspace of $$R^m$$ as $$S$$.

This uses an algorithm of Schwarz-Rutishauser. See pp. 9 of https://people.inf.ethz.ch/gander/papers/qrneu.pdf

void mpf_mat_qr(mpf_mat_t Q, mpf_mat_t R, const mpf_mat_t A)

Computes the $$QR$$ decomposition of a matrix A using the Gram-Schmidt process. (Sets Q and R such that $$A = QR$$ where R is an upper triangular matrix and Q is an orthogonal matrix.)

This uses an algorithm of Schwarz-Rutishauser. See pp. 9 of https://people.inf.ethz.ch/gander/papers/qrneu.pdf