#include <assert.h>
#include <stddef.h>
#include <string.h>
Go to the source code of this file.
Classes | |
struct | matd_chol_t |
struct | matd_plu_t |
struct | matd_svd_t |
struct | matd_t |
Macros | |
#define | MATD_ALLOC(name, nrows, ncols) double name ## _storage [nrows*ncols]; matd_t name = { .nrows = nrows, .ncols = ncols, .data = &name ## _storage }; |
#define | MATD_EL(m, row, col) (m)->data[((row)*(m)->ncols + (col))] |
#define | MATD_EPS 1e-8 |
#define | MATD_SVD_NO_WARNINGS 1 |
Functions | |
matd_t * | matd_add (const matd_t *a, const matd_t *b) |
void | matd_add_inplace (matd_t *a, const matd_t *b) |
matd_chol_t * | matd_chol (matd_t *A) |
void | matd_chol_destroy (matd_chol_t *chol) |
matd_t * | matd_chol_inverse (matd_t *a) |
matd_t * | matd_chol_solve (const matd_chol_t *chol, const matd_t *b) |
matd_t * | matd_copy (const matd_t *m) |
matd_t * | matd_create (int rows, int cols) |
matd_t * | matd_create_data (int rows, int cols, const double *data) |
matd_t * | matd_create_dataf (int rows, int cols, const float *data) |
matd_t * | matd_create_scalar (double v) |
matd_t * | matd_crossproduct (const matd_t *a, const matd_t *b) |
void | matd_destroy (matd_t *m) |
double | matd_det (const matd_t *a) |
double | matd_err_inf (const matd_t *a, const matd_t *b) |
double | matd_get (const matd_t *m, int row, int col) |
double | matd_get_scalar (const matd_t *m) |
matd_t * | matd_identity (int dim) |
matd_t * | matd_inverse (const matd_t *a) |
static int | matd_is_scalar (const matd_t *a) |
static int | matd_is_vector (const matd_t *a) |
static int | matd_is_vector_len (const matd_t *a, int len) |
void | matd_ltransposetriangle_solve (matd_t *u, const double *b, double *x) |
void | matd_ltriangle_solve (matd_t *u, const double *b, double *x) |
double | matd_max (matd_t *m) |
matd_t * | matd_multiply (const matd_t *a, const matd_t *b) |
matd_t * | matd_op (const char *expr,...) |
matd_plu_t * | matd_plu (const matd_t *a) |
void | matd_plu_destroy (matd_plu_t *mlu) |
double | matd_plu_det (const matd_plu_t *lu) |
matd_t * | matd_plu_l (const matd_plu_t *lu) |
matd_t * | matd_plu_p (const matd_plu_t *lu) |
matd_t * | matd_plu_solve (const matd_plu_t *mlu, const matd_t *b) |
matd_t * | matd_plu_u (const matd_plu_t *lu) |
void | matd_print (const matd_t *m, const char *fmt) |
void | matd_print_transpose (const matd_t *m, const char *fmt) |
void | matd_put (matd_t *m, int row, int col, double value) |
void | matd_put_scalar (matd_t *m, double value) |
matd_t * | matd_scale (const matd_t *a, double s) |
void | matd_scale_inplace (matd_t *a, double s) |
matd_t * | matd_select (const matd_t *a, int r0, int r1, int c0, int c1) |
static void | matd_set_data (matd_t *m, const double *data) |
matd_t * | matd_solve (matd_t *A, matd_t *b) |
matd_t * | matd_subtract (const matd_t *a, const matd_t *b) |
void | matd_subtract_inplace (matd_t *a, const matd_t *b) |
matd_svd_t | matd_svd (matd_t *A) |
matd_svd_t | matd_svd_flags (matd_t *A, int flags) |
matd_t * | matd_transpose (const matd_t *a) |
void | matd_utriangle_solve (matd_t *u, const double *b, double *x) |
double | matd_vec_dist (const matd_t *a, const matd_t *b) |
double | matd_vec_dist_n (const matd_t *a, const matd_t *b, int n) |
double | matd_vec_dot_product (const matd_t *a, const matd_t *b) |
double | matd_vec_mag (const matd_t *a) |
matd_t * | matd_vec_normalize (const matd_t *a) |
#define MATD_ALLOC | ( | name, | |
nrows, | |||
ncols | |||
) | double name ## _storage [nrows*ncols]; matd_t name = { .nrows = nrows, .ncols = ncols, .data = &name ## _storage }; |
#define MATD_EL | ( | m, | |
row, | |||
col | |||
) | (m)->data[((row)*(m)->ncols + (col))] |
#define MATD_EPS 1e-8 |
Adds the two supplied matrices together, cell-by-cell, and returns the results as a new matrix of the same dimensions. The supplied matrices must have identical dimensions. It is the caller's responsibility to call matd_destroy() on the returned matrix.
matd_chol_t* matd_chol | ( | matd_t * | A | ) |
void matd_chol_destroy | ( | matd_chol_t * | chol | ) |
matd_t* matd_chol_solve | ( | const matd_chol_t * | chol, |
const matd_t * | b | ||
) |
Creates an exact copy of the supplied matrix 'm'. It is the caller's responsibility to call matd_destroy() on the returned matrix.
matd_t* matd_create | ( | int | rows, |
int | cols | ||
) |
Creates a double matrix with the given number of rows and columns (or a scalar in the case where rows=0 and/or cols=0). All data elements will be initialized to zero. It is the caller's responsibility to call matd_destroy() on the returned matrix.
matd_t* matd_create_data | ( | int | rows, |
int | cols, | ||
const double * | data | ||
) |
Creates a double matrix with the given number of rows and columns (or a scalar in the case where rows=0 and/or cols=0). All data elements will be initialized using the supplied array of data, which must contain at least rows*cols elements, arranged in row-major order (i.e. index = row*ncols + col). It is the caller's responsibility to call matd_destroy() on the returned matrix.
matd_t* matd_create_dataf | ( | int | rows, |
int | cols, | ||
const float * | data | ||
) |
Creates a double matrix with the given number of rows and columns (or a scalar in the case where rows=0 and/or cols=0). All data elements will be initialized using the supplied array of float data, which must contain at least rows*cols elements, arranged in row-major order (i.e. index = row*ncols + col). It is the caller's responsibility to call matd_destroy() on the returned matrix.
matd_t* matd_create_scalar | ( | double | v | ) |
Creates a scalar with the supplied value 'v'. It is the caller's responsibility to call matd_destroy() on the returned matrix.
NOTE: Scalars are different than 1x1 matrices (implementation note: they are encoded as 0x0 matrices). For example: for matrices A*B, A and B must both have specific dimensions. However, if A is a scalar, there are no restrictions on the size of B.
Calculates the cross product of supplied matrices 'a' and 'b' (i.e. a x b) and returns it as a new matrix. Both 'a' and 'b' must be vectors of dimension 3, but can be either row or column vectors. It is the caller's responsibility to call matd_destroy() on the returned matrix.
void matd_destroy | ( | matd_t * | m | ) |
double matd_det | ( | const matd_t * | a | ) |
double matd_get | ( | const matd_t * | m, |
int | row, | ||
int | col | ||
) |
double matd_get_scalar | ( | const matd_t * | m | ) |
matd_t* matd_identity | ( | int | dim | ) |
Creates a square identity matrix with the given number of rows (and therefore columns), or a scalar with value 1 in the case where dim=0. It is the caller's responsibility to call matd_destroy() on the returned matrix.
Attempts to compute an inverse of the supplied matrix 'a' and return it as a new matrix. This is strictly only possible if the determinant of 'a' is non-zero (matd_det(a) != 0).
If the determinant is zero, NULL is returned. It is otherwise the caller's responsibility to cope with the results caused by poorly conditioned matrices. (E.g.., if such a situation is likely to arise, compute the pseudo-inverse from the SVD.)
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
void matd_ltransposetriangle_solve | ( | matd_t * | u, |
const double * | b, | ||
double * | x | ||
) |
void matd_ltriangle_solve | ( | matd_t * | u, |
const double * | b, | ||
double * | x | ||
) |
Multiplies the two supplied matrices together (matrix product), and returns the results as a new matrix. The supplied matrices must have dimensions such that columns(a) = rows(b). The returned matrix will have a row count of rows(a) and a column count of columns(b). It is the caller's responsibility to call matd_destroy() on the returned matrix.
matd_t* matd_op | ( | const char * | expr, |
... | |||
) |
Creates a new matrix by applying a series of matrix operations, as expressed in 'expr', to the supplied list of matrices. Each matrix to be operated upon must be represented in the expression by a separate matrix placeholder, 'M', and there must be one matrix supplied as an argument for each matrix placeholder in the expression. All rules and caveats of the corresponding matrix operations apply to the operated-on matrices. It is the caller's responsibility to call matd_destroy() on the returned matrix.
Available operators (in order of increasing precedence): M+M add two matrices together M-M subtract one matrix from another M*M multiply two matrices together (matrix product) MM multiply two matrices together (matrix product) -M negate a matrix M^-1 take the inverse of a matrix M' take the transpose of a matrix
Expressions can be combined together and grouped by enclosing them in parenthesis, i.e.: -M(M+M+M)-(M*M)^-1
Scalar values can be generated on-the-fly, i.e.: M*2.2 scales M by 2.2 -2+M adds -2 to all elements of M
All whitespace in the expression is ignored.
matd_plu_t* matd_plu | ( | const matd_t * | a | ) |
void matd_plu_destroy | ( | matd_plu_t * | mlu | ) |
double matd_plu_det | ( | const matd_plu_t * | lu | ) |
matd_t* matd_plu_l | ( | const matd_plu_t * | lu | ) |
matd_t* matd_plu_p | ( | const matd_plu_t * | lu | ) |
matd_t* matd_plu_solve | ( | const matd_plu_t * | mlu, |
const matd_t * | b | ||
) |
matd_t* matd_plu_u | ( | const matd_plu_t * | lu | ) |
void matd_print | ( | const matd_t * | m, |
const char * | fmt | ||
) |
void matd_print_transpose | ( | const matd_t * | m, |
const char * | fmt | ||
) |
void matd_put | ( | matd_t * | m, |
int | row, | ||
int | col, | ||
double | value | ||
) |
Assigns the given value to the matrix cell at the given zero-based row and column index. Performs more thorough validation checking than MATD_EL().
void matd_put_scalar | ( | matd_t * | m, |
double | value | ||
) |
Assigns the given value to the supplied scalar element ('m' must be a scalar). Performs more thorough validation checking than MATD_EL().
Scales all cell values of matrix 'a' by the given scale factor 's' and returns the result as a new matrix of the same dimensions. It is the caller's responsibility to call matd_destroy() on the returned matrix.
void matd_scale_inplace | ( | matd_t * | a, |
double | s | ||
) |
Creates a copy of a subset of the supplied matrix 'a'. The subset will include rows 'r0' through 'r1', inclusive ('r1' >= 'r0'), and columns 'c0' through 'c1', inclusive ('c1' >= 'c0'). All parameters are zero-based (i.e. matd_select(a, 0, 0, 0, 0) will return only the first cell). Cannot be used on scalars or to extend beyond the number of rows/columns of 'a'. It is the caller's responsibility to call matd_destroy() on the returned matrix.
|
inlinestatic |
Subtracts matrix 'b' from matrix 'a', cell-by-cell, and returns the results as a new matrix of the same dimensions. The supplied matrices must have identical dimensions. It is the caller's responsibility to call matd_destroy() on the returned matrix.
matd_svd_t matd_svd | ( | matd_t * | A | ) |
Compute a complete SVD of a matrix. The SVD exists for all matrices. For a matrix MxN, we will have:
A = U*S*V'
where A is MxN, U is MxM (and is an orthonormal basis), S is MxN (and is diagonal up to machine precision), and V is NxN (and is an orthonormal basis).
The caller is responsible for destroying U, S, and V.
matd_svd_t matd_svd_flags | ( | matd_t * | A, |
int | flags | ||
) |
Creates a matrix which is the transpose of the supplied matrix 'a'. It is the caller's responsibility to call matd_destroy() on the returned matrix.
void matd_utriangle_solve | ( | matd_t * | u, |
const double * | b, | ||
double * | x | ||
) |
double matd_vec_mag | ( | const matd_t * | a | ) |
Calculates the normalization of the supplied vector 'a' (i.e. a unit vector of the same dimension and orientation as 'a' with a magnitude of 1) and returns it as a new vector. 'a' must be a vector of any dimension and must have a non-zero magnitude. It is the caller's responsibility to call matd_destroy() on the returned matrix.