-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmatrix.h
151 lines (117 loc) · 4.61 KB
/
matrix.h
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct {
uint8_t dim;
double *data;
} vector_t;
/*
Структура матрицы
cols - количество столбцов
rows - количество строк
data - двумерный массив
*/
typedef struct {
uint8_t cols;
uint8_t rows;
double **data;
uint8_t is_square;
} matrix_t;
// ******************************************
//
// CONSTRUCTING AND DESTROYING A MATRIX STRUCT
//
// ******************************************
vector_t *vector_new(uint8_t dim);
matrix_t *matrix_new(uint8_t rows, uint8_t cols);
vector_t *vector_copy(vector_t *v);
vector_t *vector_eye(uint8_t dim);
matrix_t *matrix_sqr_zero(uint8_t size);
matrix_t *matrix_eye(uint8_t size);
matrix_t *matrix_copy(matrix_t *m);
matrix_t *matrix_from_arr(uint8_t rows, uint8_t cols, uint8_t dim, double *values);
matrix_t *matrix_from_vec(uint8_t rows, uint8_t cols, vector_t *v);
vector_t *vector_from_arr(uint8_t dim, double *values);
void matrix_free(matrix_t *m);
void vector_free(vector_t *v);
// ******************************************
//
// HELP FUNCTIONS
//
// ******************************************
uint8_t matrix_check_row(matrix_t *m, uint8_t row);
uint8_t matrix_check_col(matrix_t *m, uint8_t col);
uint8_t matrix_check_dim(matrix_t *m, uint8_t row, uint8_t col);
uint8_t vector_check_dim(vector_t *v, uint8_t dim);
// ******************************************
//
// MATRIX EQUALITY
//
// ******************************************
uint8_t vector_eq_dim(vector_t *v1, vector_t *v2);
uint8_t matrix_eq_dim(matrix_t *m1, matrix_t *m2);
uint8_t vector_eq(vector_t *v1, vector_t *v2, double tolerance);
uint8_t matrix_eq(matrix_t *m1, matrix_t *m2, double tolerance);
// ******************************************
//
// MATRIX PRINTING
//
// ******************************************
void matrix_print(matrix_t *m);
void vector_print(vector_t *v);
// *******************************************
//
// Accessing and modifying matrix elements
//
// *******************************************
double vector_get_el(vector_t *v, uint8_t i);
double matrix_get_el(matrix_t *m, uint8_t i, uint8_t j);
vector_t *matrix_get_col(matrix_t *m, uint8_t col);
vector_t *matrix_get_row(matrix_t *m, uint8_t row);
uint8_t vector_set_el(vector_t *v, uint8_t i, double value);
uint8_t matrix_set_el(matrix_t *m, uint8_t i, uint8_t j, double value);
uint8_t matrix_set_all(matrix_t *m, double value);
uint8_t matrix_diag_set(matrix_t *m, double value);
uint8_t matrix_diag_set_vector(matrix_t *m, vector_t *v);
vector_t *matrix_mult_vector(matrix_t *m, vector_t *v);
uint8_t matrix_mult_scalar_ip(matrix_t *m, double value);
matrix_t *matrix_mult_scalar(matrix_t *m, double value);
uint8_t matrix_mult_row_ip(matrix_t *m, uint8_t row, double value);
matrix_t *matrix_mult_row(matrix_t *m, uint8_t row, double value);
uint8_t matrix_mult_col_ip(matrix_t *m, uint8_t col, double value);
matrix_t *matrix_mult_col(matrix_t *m, uint8_t col, double value);
uint8_t matrix_add_row_ip(matrix_t *m, uint8_t where, uint8_t row, double multiplier);
matrix_t *matrix_add_row(matrix_t *m, uint8_t where, uint8_t row, double multiplier);
uint8_t vector_mult_scalar_ip(vector_t *v, double value, double add);
vector_t *vector_mult_scalar(vector_t *v, double value, double add);
uint8_t vector_add_to_el_ip(vector_t *v, uint8_t element, double value);
vector_t *vector_add_to_el(vector_t *v, uint8_t element, double value);
// *******************************************
//
// Modifying the matrix structure
//
// *******************************************
matrix_t *matrix_rem_col(matrix_t *m, uint8_t col);
matrix_t *matrix_rem_row(matrix_t *m, uint8_t row);
uint8_t matrix_col_swap_ip(matrix_t *m, uint8_t col1, uint8_t col2);
matrix_t *matrix_col_swap(matrix_t *m, uint8_t col1, uint8_t col2);
uint8_t matrix_row_swap_ip(matrix_t *m, uint8_t row1, uint8_t row2);
matrix_t *matrix_row_swap(matrix_t *m, uint8_t row1, uint8_t row2);
uint8_t matrix_add_ip(matrix_t *m1, matrix_t *m2);
matrix_t *matrix_add(matrix_t *m1, matrix_t *m2);
uint8_t matrix_sub_ip(matrix_t *m1, matrix_t *m2);
matrix_t *matrix_sub(matrix_t *m1, matrix_t *m2);
matrix_t *matrix_dot(matrix_t *m1, matrix_t *m2);
matrix_t *matrix_transpose(matrix_t *m);
double matrix_trace(matrix_t *m);
double vector_scalar_dot(vector_t *v1, vector_t *v2);
double vector_norm2(vector_t *v);
double vector_norm(vector_t *v);
uint8_t vector_normalize_ip(vector_t *v);
vector_t *vector_normalize(vector_t *v);
// *******************************************
//
// Matrix invertion
//
// *******************************************
matrix_t *matrix_invert(matrix_t *m1);