#ifndef LIN_ALG_H # define LIN_ALG_H # ifdef __cplusplus extern "C" { # endif // ifdef __cplusplus # include "types.h" /* VECTOR FUNCTIONS ----------------------------------------------------------*/ # ifndef EMBEDDED /* copy vector a into output (Uses MALLOC)*/ c_float* vec_copy(c_float *a, c_int n); # endif // ifndef EMBEDDED /* copy vector a into preallocated vector b */ void prea_vec_copy(const c_float *a, c_float *b, c_int n); /* copy integer vector a into preallocated vector b */ void prea_int_vec_copy(const c_int *a, c_int *b, c_int n); /* set float vector to scalar */ void vec_set_scalar(c_float *a, c_float sc, c_int n); /* set integer vector to scalar */ void int_vec_set_scalar(c_int *a, c_int sc, c_int n); /* add scalar to vector*/ void vec_add_scalar(c_float *a, c_float sc, c_int n); /* multiply scalar to vector */ void vec_mult_scalar(c_float *a, c_float sc, c_int n); /* c = a + sc*b */ void vec_add_scaled(c_float *c, const c_float *a, const c_float *b, c_int n, c_float sc); /* ||v||_inf */ c_float vec_norm_inf(const c_float *v, c_int l); /* ||Sv||_inf */ c_float vec_scaled_norm_inf(const c_float *S, const c_float *v, c_int l); /* ||a - b||_inf */ c_float vec_norm_inf_diff(const c_float *a, const c_float *b, c_int l); /* mean of vector elements */ c_float vec_mean(const c_float *a, c_int n); # if EMBEDDED != 1 /* Vector elementwise reciprocal b = 1./a (needed for scaling)*/ void vec_ew_recipr(const c_float *a, c_float *b, c_int n); # endif // if EMBEDDED != 1 /* Inner product a'b */ c_float vec_prod(const c_float *a, const c_float *b, c_int n); /* Elementwise product a.*b stored in c*/ void vec_ew_prod(const c_float *a, const c_float *b, c_float *c, c_int n); # if EMBEDDED != 1 /* Elementwise sqrt of the vector elements */ void vec_ew_sqrt(c_float *a, c_int n); /* Elementwise max between each vector component and max_val */ void vec_ew_max(c_float *a, c_int n, c_float max_val); /* Elementwise min between each vector component and max_val */ void vec_ew_min(c_float *a, c_int n, c_float min_val); /* Elementwise maximum between vectors c = max(a, b) */ void vec_ew_max_vec(const c_float *a, const c_float *b, c_float *c, c_int n); /* Elementwise minimum between vectors c = min(a, b) */ void vec_ew_min_vec(const c_float *a, const c_float *b, c_float *c, c_int n); # endif // if EMBEDDED != 1 /* MATRIX FUNCTIONS ----------------------------------------------------------*/ /* multiply scalar to matrix */ void mat_mult_scalar(csc *A, c_float sc); /* Premultiply matrix A by diagonal matrix with diagonal d, i.e. scale the rows of A by d */ void mat_premult_diag(csc *A, const c_float *d); /* Premultiply matrix A by diagonal matrix with diagonal d, i.e. scale the columns of A by d */ void mat_postmult_diag(csc *A, const c_float *d); /* Matrix-vector multiplication * y = A*x (if plus_eq == 0) * y += A*x (if plus_eq == 1) * y -= A*x (if plus_eq == -1) */ void mat_vec(const csc *A, const c_float *x, c_float *y, c_int plus_eq); /* Matrix-transpose-vector multiplication * y = A'*x (if plus_eq == 0) * y += A'*x (if plus_eq == 1) * y -= A'*x (if plus_eq == -1) * If skip_diag == 1, then diagonal elements of A are assumed to be zero. */ void mat_tpose_vec(const csc *A, const c_float *x, c_float *y, c_int plus_eq, c_int skip_diag); # if EMBEDDED != 1 /** * Infinity norm of each matrix column * @param M Input matrix * @param E Vector of infinity norms * */ void mat_inf_norm_cols(const csc *M, c_float *E); /** * Infinity norm of each matrix row * @param M Input matrix * @param E Vector of infinity norms * */ void mat_inf_norm_rows(const csc *M, c_float *E); /** * Infinity norm of each matrix column * Matrix M is symmetric upper-triangular * * @param M Input matrix (symmetric, upper-triangular) * @param E Vector of infinity norms * */ void mat_inf_norm_cols_sym_triu(const csc *M, c_float *E); # endif // EMBEDDED != 1 /** * Compute quadratic form f(x) = 1/2 x' P x * @param P quadratic matrix in CSC form (only upper triangular) * @param x argument float vector * @return quadratic form value */ c_float quad_form(const csc *P, const c_float *x); # ifdef __cplusplus } # endif // ifdef __cplusplus #endif // ifndef LIN_ALG_H