RcdMathLib_doc
Open Source Library for Linear and Non-linear Algebra
vector.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2020 Zakaria Kasmi <zkasmi@inf.fu-berlin.de>
3  * 2020 Freie Universität Berlin
4  *
5  * This file is subject to the terms and conditions of the GNU Lesser General
6  * Public License v2.1. See the file LICENSE in the top level directory for more
7  * details.
8  */
9 
23 #include <inttypes.h>
24 #include <stdio.h>
25 #include <string.h>
26 #include <math.h>
27 #include <stdbool.h>
28 
29 #include "vector.h"
30 #include "utils.h"
31 
32 void vector_clear(uint8_t n, vector_t arr[])
33 {
34  memset(arr, 0, sizeof(vector_t) * n);
35 }
36 
37 void vector_copy(uint8_t size, vector_t src_arr[], vector_t dest_arr[])
38 {
39  memcpy(dest_arr, src_arr, size * sizeof(vector_t));
40 }
41 
42 vector_t vector_get_norm2(uint8_t length, vector_t arr[])
43 {
44  vector_t square_norm = 0.0;
45  uint8_t i = 0;
46 
47  for (; i < length; i++) {
48  square_norm += arr[i] * arr[i];
49  }
50 
51  return sqrt(square_norm);
52 }
53 
55 {
56  vector_t square_norm = 0.0;
57  uint8_t i = 0;
58 
59  for (; i < length; i++) {
60  square_norm += arr[i] * arr[i];
61  }
62 
63  return square_norm;
64 }
65 
66 vector_t vector_get_sum(uint8_t length, vector_t arr[])
67 {
68  vector_t sum = 0.0;
69  uint8_t i;
70 
71  for (i = 0; i < length; i++) {
72  sum += arr[i];
73  }
74 
75  return sum;
76 }
77 
78 vector_t vector_get_mean_value(uint8_t length, vector_t arr[])
79 {
80  vector_t mean = 0.0;
81  uint8_t i;
82 
83  for (i = 0; i < length; i++) {
84  mean += arr[i];
85  }
86 
87  if (length != 0) {
88  mean /= length;
89  }
90 
91  return mean;
92 }
93 
94 void vector_sub(uint8_t size, vector_t a_vec[], vector_t b_vec[],
95  vector_t a_minus_b[])
96 {
97  uint8_t i;
98 
99  for (i = 0; i < size; i++) {
100  a_minus_b[i] = a_vec[i] - b_vec[i];
101  }
102 }
103 
104 void vector_add(uint8_t size, vector_t a_vec[size], vector_t b_vec[size],
105  vector_t a_plus_b_vec[size])
106 {
107  uint8_t i;
108 
109  for (i = 0; i < size; i++) {
110  a_plus_b_vec[i] = a_vec[i] + b_vec[i];
111  }
112 }
113 
114 void vector_mul(uint8_t size, vector_t a_vec[size], vector_t b_vec[size],
115  vector_t a_mul_b_vec[size])
116 {
117  uint8_t i;
118 
119  for (i = 0; i < size; i++) {
120  a_mul_b_vec[i] = a_vec[i] * b_vec[i];
121  }
122 }
123 
124 void vector_square(uint8_t n, vector_t vec[n], vector_t square_vec[n])
125 {
126  for (int i = 0; i < n; i++) {
127  square_vec[i] = vec[i] * vec[i];
128  }
129 }
130 
131 void vector_in_place_scalar_mul(uint8_t size, vector_t a_vec[size],
132  vector_t scl)
133 {
134  uint8_t i;
135 
136  for (i = 0; i < size; i++) {
137  a_vec[i] = scl * a_vec[i];
138  }
139 }
140 
141 void vector_scalar_mul(uint8_t size, vector_t src_vec[size], vector_t scl,
142  vector_t dest_vec[])
143 {
144  uint8_t i;
145 
146  for (i = 0; i < size; i++) {
147  dest_vec[i] = scl * src_vec[i];
148  }
149 }
150 
151 void vector_scalar_div(uint8_t size, vector_t a_vec[size], vector_t scl)
152 {
153  uint8_t i;
154 
155  if (scl != 0) {
156  for (i = 0; i < size; i++) {
157  a_vec[i] = a_vec[i] / scl;
158  }
159  }
160 }
161 
162 //Euclidean distance: d = sum((x-y).^2).^0.5
164  vector_t vec2[])
165 {
166  vector_t d = 0.0;
167  vector_t diff_vec[length];
168 
169  vector_sub(length, vec1, vec2, diff_vec);
170  d = vector_get_norm2(length, diff_vec);
171 
172  return d;
173 }
174 
176  uint8_t *index)
177 {
178  vector_t max = vec[0];
179 
180  *index = 0;
181  for (uint8_t i = 1; i < length; i++) {
182  if (vec[i] > max) {
183  max = vec[i];
184  *index = *index + 1;
185  }
186  }
187  return max;
188 }
189 
191  vector_t vec2[n])
192 {
193  vector_t r = 0;
194 
195  for (int i = 0; i < n; i++) {
196  r = r + (vec1[i] * vec2[i]);
197  }
198 
199  return r;
200 }
201 
202 bool vector_is_equal(uint16_t length, vector_t vec_1[], vector_t vec_2[])
203 {
204 
205  for (uint16_t i = 0; i < length; i++) {
206  if (vec_1[i] != vec_2[i]) {
207  return false;
208  }
209  }
210 
211  return true;
212 }
213 
214 void vector_get_index_vector(uint8_t k, uint8_t n, vector_t unsorted_vector[n],
215  vector_t sorted_vector[n], uint8_t index_vector[n])
216 {
217 
218  for (int i = 0; i < k; i++) {
219  for (int j = 0; j < n; j++) {
220  if (unsorted_vector[j] == sorted_vector[i]) {
221  index_vector[i] = j;
222  }
223  }
224  }
225 }
226 
227 vector_t vector_get_residual(uint8_t length, vector_t a_vec[], vector_t b_vec[])
228 {
229  vector_t diff_vec[length];
230 
231  vector_sub(length, a_vec, b_vec, diff_vec);
232  return vector_get_norm2(length, diff_vec);
233 }
234 
235 void vector_get_elements(vector_t src_vec[], uint8_t k, uint8_t index_vec[],
236  vector_t dst_vec[])
237 {
238  for (uint8_t i = 0; i < k; i++) {
239  dst_vec[i] = src_vec[index_vec[i]];
240  }
241 }
242 
243 bool vector_uint32_is_equal(uint32_t length, uint32_t vec_1[], uint32_t vec_2[])
244 {
245 
246  for (uint32_t i = 0; i < length; i++) {
247  if (vec_1[i] != vec_2[i]) {
248  return false;
249  }
250  }
251 
252  return true;
253 }
254 
255 void vector_print(uint32_t length, vector_t arr[])
256 {
257  uint16_t i;
258 
259  printf("{");
260  for (i = 0; i < length; i++) {
261  printf("%5.4f", arr[i]);
262  if (i < length - 1) {
263  printf(", ");
264  }
265  }
266  printf("}");
267 }
268 
269 void vector_print_u8_array(uint32_t length, uint8_t arr[])
270 {
271  uint32_t i;
272 
273  printf("{");
274  for (i = 0; i < length; i++) {
275  printf("%u", arr[i]);
276  if (i < length - 1) {
277  printf(", ");
278  }
279  }
280  printf("}");
281 }
282 
283 // This function is more memory-consuming than vector_print
284 void vector_flex_print(uint32_t length, vector_t arr[], uint8_t before_dot,
285  uint8_t after_dot)
286 {
287  uint32_t i;
288  char format_str_buff[13];
289 
290  sprintf(format_str_buff, "%%%u.%uf", before_dot, after_dot);
291  printf("{");
292  for (i = 0; i < length; i++) {
293  //printf(format_str_buff, arr[i]);
294  utils_printf(format_str_buff, arr[i]);
295  if (i < length - 1) {
296  printf(", ");
297  }
298  }
299  printf("}");
300  //puts("");
301 }
vector_get_norm2
vector_t vector_get_norm2(uint8_t length, vector_t arr[])
Compute the 2-norm norm of a vector.
Definition: vector.c:42
vector_get_scalar_product
vector_t vector_get_scalar_product(uint8_t n, vector_t vec1[n], vector_t vec2[n])
Compute the dot product of two vectors.
Definition: vector.c:190
vector_flex_print
void vector_flex_print(uint32_t length, vector_t arr[], uint8_t before_dot, uint8_t after_dot)
Display the values of the vector's elements.
Definition: vector.c:284
vector_is_equal
bool vector_is_equal(uint16_t length, vector_t vec_1[], vector_t vec_2[])
Determine the equality of two vectors.
Definition: vector.c:202
vector_clear
void vector_clear(uint8_t n, vector_t arr[])
Clear all the elements of the vector.
Definition: vector.c:32
vector_print
void vector_print(uint32_t length, vector_t arr[])
Display the values of the vector's elements.
Definition: vector.c:255
vector_get_index_vector
void vector_get_index_vector(uint8_t k, uint8_t n, vector_t unsorted_vector[n], vector_t sorted_vector[n], uint8_t index_vector[n])
Determine the index of the vector elements before sorting.
Definition: vector.c:214
vector_get_square_norm2
vector_t vector_get_square_norm2(uint8_t length, vector_t arr[])
Compute the squared 2-norm norm of a vector .
Definition: vector.c:54
vector_t
#define vector_t
Define the data type of the vector elements.
Definition: vector.h:33
vector_in_place_scalar_mul
void vector_in_place_scalar_mul(uint8_t size, vector_t a_vec[size], vector_t scl)
Compute the product of a vector with a real number.
Definition: vector.c:131
utils.h
Utilities for linear algebra.
vector_sub
void vector_sub(uint8_t size, vector_t a_vec[], vector_t b_vec[], vector_t a_minus_b[])
Compute the subtraction of two vectors.
Definition: vector.c:94
vector_get_max_and_index
vector_t vector_get_max_and_index(uint8_t length, vector_t vec[], uint8_t *index)
Compute the maximal value and its index of a vector.
Definition: vector.c:175
vector_scalar_mul
void vector_scalar_mul(uint8_t size, vector_t src_vec[size], vector_t scl, vector_t dest_vec[])
Compute the product of a vector with a real number.
Definition: vector.c:141
vector_copy
void vector_copy(uint8_t size, vector_t src_arr[], vector_t dest_arr[])
Copy the elements of the source vector to the destination vector.
Definition: vector.c:37
vector_get_elements
void vector_get_elements(vector_t src_vec[], uint8_t k, uint8_t index_vec[], vector_t dst_vec[])
Get the elements of the vector by an index vector.
Definition: vector.c:235
utils_printf
void utils_printf(char *format_str,...)
Print by using variable format string as well as argument lists.
Definition: utils.c:96
vector_scalar_div
void vector_scalar_div(uint8_t size, vector_t a_vec[size], vector_t scl)
Compute the division of a vector with a real number.
Definition: vector.c:151
vector_add
void vector_add(uint8_t size, vector_t a_vec[size], vector_t b_vec[size], vector_t a_plus_b_vec[size])
Compute the addition of two vectors.
Definition: vector.c:104
vector_get_residual
vector_t vector_get_residual(uint8_t length, vector_t a_vec[], vector_t b_vec[])
Compute the residual of two vectors.
Definition: vector.c:227
vector_get_mean_value
vector_t vector_get_mean_value(uint8_t length, vector_t arr[])
Compute the average or mean value of a vector.
Definition: vector.c:78
vector_print_u8_array
void vector_print_u8_array(uint32_t length, uint8_t arr[])
Display the values of the vector's elements of type uint8_t.
Definition: vector.c:269
vector.h
Vector computations.
vector_mul
void vector_mul(uint8_t size, vector_t a_vec[size], vector_t b_vec[size], vector_t a_mul_b_vec[size])
Compute the multiplication of two vectors.
Definition: vector.c:114
vector_square
void vector_square(uint8_t n, vector_t vec[n], vector_t square_vec[n])
Compute the square of a vector.
Definition: vector.c:124
vector_get_sum
vector_t vector_get_sum(uint8_t length, vector_t arr[])
Compute the sum of the elements of a vector.
Definition: vector.c:66
vector_uint32_is_equal
bool vector_uint32_is_equal(uint32_t length, uint32_t vec_1[], uint32_t vec_2[])
Determine the equality of two vectors of type uint32_t.
Definition: vector.c:243
vector_get_euclidean_distance
vector_t vector_get_euclidean_distance(uint8_t length, vector_t vec1[], vector_t vec2[])
Compute the Euclidean distance between two vectors.
Definition: vector.c:163