diff options
author | Elizabeth Hunt <elizabeth.hunt@simponic.xyz> | 2023-10-13 21:00:07 -0600 |
---|---|---|
committer | Elizabeth Hunt <elizabeth.hunt@simponic.xyz> | 2023-10-13 21:00:07 -0600 |
commit | d21a7de801b4a326001e45c0d26826e9ab53589b (patch) | |
tree | 314c35f77473b651f4a2f79395769595ddb9dd6c /src/vector.c | |
parent | cae58e90e0a2f19aa9a01177ef1707904f22c64c (diff) | |
download | cmath-d21a7de801b4a326001e45c0d26826e9ab53589b.tar.gz cmath-d21a7de801b4a326001e45c0d26826e9ab53589b.zip |
hw 4
Diffstat (limited to 'src/vector.c')
-rw-r--r-- | src/vector.c | 84 |
1 files changed, 42 insertions, 42 deletions
diff --git a/src/vector.c b/src/vector.c index a7ff783..4a6250c 100644 --- a/src/vector.c +++ b/src/vector.c @@ -2,30 +2,18 @@ #include <assert.h> #include <float.h> #include <math.h> -#include <string.h> #include <stdio.h> +#include <string.h> -double l2_norm(Array_double *v) { - double norm = 0; - for (size_t i = 0; i < v->size; ++i) - norm += v->data[i] * v->data[i]; - return sqrt(norm); -} +Array_double *add_v(Array_double *v1, Array_double *v2) { + assert(v1->size == v2->size); -double l1_norm(Array_double *v) { - double sum = 0; - for (size_t i = 0; i < v->size; ++i) - sum += fabs(v->data[i]); + Array_double *sum = copy_vector(v1); + for (size_t i = 0; i < v1->size; i++) + sum->data[i] += v2->data[i]; return sum; } -double linf_norm(Array_double *v) { - double max = -DBL_MAX; - for (size_t i = 0; i < v->size; ++i) - max = c_max(v->data[i], max); - return max; -} - Array_double *minus_v(Array_double *v1, Array_double *v2) { assert(v1->size == v2->size); @@ -35,13 +23,6 @@ Array_double *minus_v(Array_double *v1, Array_double *v2) { return sub; } -double sum_v(Array_double *v) { - double sum = 0; - for (size_t i = 0; i < v->size; i++) - sum += v->data[i]; - return sum; -} - Array_double *scale_v(Array_double *v, double m) { Array_double *copy = copy_vector(v); for (size_t i = 0; i < v->size; i++) @@ -49,16 +30,29 @@ Array_double *scale_v(Array_double *v, double m) { return copy; } -Array_double *add_v(Array_double *v1, Array_double *v2) { - assert(v1->size == v2->size); - - Array_double *sum = copy_vector(v1); - for (size_t i = 0; i < v1->size; i++) - sum->data[i] += v2->data[i]; +double l1_norm(Array_double *v) { + double sum = 0; + for (size_t i = 0; i < v->size; ++i) + sum += fabs(v->data[i]); return sum; } -double dot_v(Array_double *v1, Array_double *v2) { +double l2_norm(Array_double *v) { + double norm = 0; + for (size_t i = 0; i < v->size; ++i) + norm += v->data[i] * v->data[i]; + return sqrt(norm); +} + +double linf_norm(Array_double *v) { + assert(v->size > 0); + double max = v->data[0]; + for (size_t i = 0; i < v->size; ++i) + max = c_max(v->data[i], max); + return max; +} + +double v_dot_v(Array_double *v1, Array_double *v2) { assert(v1->size == v2->size); double dot = 0; @@ -67,25 +61,24 @@ double dot_v(Array_double *v1, Array_double *v2) { return dot; } -double l2_distance(Array_double *v1, Array_double *v2) { +double vector_distance(Array_double *v1, Array_double *v2, + double (*norm)(Array_double *)) { Array_double *minus = minus_v(v1, v2); - double dist = l2_norm(minus); + double dist = (*norm)(minus); free(minus); return dist; } double l1_distance(Array_double *v1, Array_double *v2) { - Array_double *minus = minus_v(v1, v2); - double dist = l1_norm(minus); - free(minus); - return dist; + return vector_distance(v1, v2, &l1_norm); +} + +double l2_distance(Array_double *v1, Array_double *v2) { + return vector_distance(v1, v2, &l2_norm); } double linf_distance(Array_double *v1, Array_double *v2) { - Array_double *minus = minus_v(v1, v2); - double dist = linf_norm(minus); - free(minus); - return dist; + return vector_distance(v1, v2, &linf_norm); } Array_double *copy_vector(Array_double *v) { @@ -115,3 +108,10 @@ void format_vector_into(Array_double *v, char *s) { } strcat(s, "\n"); } + +double sum_v(Array_double *v) { + double sum = 0; + for (size_t i = 0; i < v->size; i++) + sum += v->data[i]; + return sum; +} |