#ifndef VECTOR_H #define VECTOR_H #include #include #define vector_at(v, i) ((v)->xs[(i)]) #define vector_loop(v, i) matrix_loop((v)->mat, i) #define vector_foreach(v, it) matrix_foreach((v)->mat, it) #define vector_foreach_idx(v, it, i) matrix_foreach_idx((v)->mat, it, i, _) #define VECTOR_DIM_MATCH(v1, v2) ((v1)->m == (v2)->m) #define vector_is_colvec(v) matrix_is_colvec((v)->mat) typedef struct Matrix Matrix; typedef struct Vector { double *xs; size_t m; Matrix *mat; } Vector; Vector *vector_alloc(size_t m); Vector *vector_alloc1(Matrix *mat); void vector_free(Vector *v); void vector_free_many(size_t argcount, ...); void vector_print(const Vector *v); Vector *vector_from_str(char *str); Vector *vector_from_arr(double arr[], size_t m); Vector *vector_unit(size_t m, size_t i); Vector *vector_const(size_t m, double x); void vector_const1(Vector *v, double x); Vector *vector_slice(const Vector *v, size_t i, size_t j); Vector *vector_copy(const Vector *v); void vector_copy1(Vector *u, const Vector *v); Vector *vector_transpose(const Vector *v); void vector_transpose1(Vector *v); Vector *vector_add(const Vector *u, const Vector *v); void vector_add1(Vector *u, const Vector *v); Vector *vector_scale(const Vector *v, double x); void vector_scale1(Vector *v, double x); Vector *vector_sub(const Vector *u, const Vector *v); void vector_sub1(Vector *u, const Vector *v); Vector *vector_rand(size_t m, int bound_l, int bound_u); void vector_rand1(Vector *v, int bound_l, int bound_u); bool vector_eq(const Vector *u, const Vector *v, double tol); double vector_norm_p(const Vector *v, size_t p); double vector_norm_max(const Vector *v); #endif