summaryrefslogtreecommitdiff
path: root/vector.h
blob: 52fefd5e816151dbfada9aca58ca125ae43ad3d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifndef VECTOR_H
#define VECTOR_H

#include <stddef.h>
#include <stdbool.h>

#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