From d21a7de801b4a326001e45c0d26826e9ab53589b Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Fri, 13 Oct 2023 21:00:07 -0600 Subject: hw 4 --- src/vector.c | 84 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 42 insertions(+), 42 deletions(-) (limited to 'src/vector.c') 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 #include #include -#include #include +#include -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; +} -- cgit v1.2.3-70-g09d2