summaryrefslogtreecommitdiff
path: root/src/vector.c
diff options
context:
space:
mode:
authorElizabeth Hunt <elizabeth.hunt@simponic.xyz>2023-10-13 21:00:07 -0600
committerElizabeth Hunt <elizabeth.hunt@simponic.xyz>2023-10-13 21:00:07 -0600
commitd21a7de801b4a326001e45c0d26826e9ab53589b (patch)
tree314c35f77473b651f4a2f79395769595ddb9dd6c /src/vector.c
parentcae58e90e0a2f19aa9a01177ef1707904f22c64c (diff)
downloadcmath-d21a7de801b4a326001e45c0d26826e9ab53589b.tar.gz
cmath-d21a7de801b4a326001e45c0d26826e9ab53589b.zip
hw 4
Diffstat (limited to 'src/vector.c')
-rw-r--r--src/vector.c84
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;
+}