From 31a3a2a3faeccd4ee69e1fc047c250a5a96a5aeb Mon Sep 17 00:00:00 2001 From: Al Date: Fri, 8 Jan 2016 00:44:33 -0500 Subject: [PATCH] [math] Matrix scalar arithmetic functions --- src/matrix.c | 29 ++++++++++++++++++++++++----- src/matrix.h | 4 ++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/matrix.c b/src/matrix.c index 62a98a6f..6b338d9b 100644 --- a/src/matrix.c +++ b/src/matrix.c @@ -73,16 +73,35 @@ inline void matrix_set(matrix_t *self, double value) { } inline void matrix_set_row(matrix_t *self, size_t index, double *row) { - size_t offset = index * self->m; + size_t offset = index * self->n; double *values = self->values; size_t n = self->n; memcpy(values + offset, row, n * sizeof(double)); } inline void matrix_set_scalar(matrix_t *self, size_t row_index, size_t col_index, double value) { - size_t offset = row_index * self->m + col_index; - double *values = self->values; - values[offset] = value; + size_t offset = row_index * self->n + col_index; + self->values[offset] = value; +} + +inline void matrix_add_scalar(matrix_t *self, size_t row_index, size_t col_index, double value) { + size_t offset = row_index * self->n + col_index; + self->values[offset] += value; +} + +inline void matrix_sub_scalar(matrix_t *self, size_t row_index, size_t col_index, double value) { + size_t offset = row_index * self->n + col_index; + self->values[offset] -= value; +} + +inline void matrix_mul_scalar(matrix_t *self, size_t row_index, size_t col_index, double value) { + size_t offset = row_index * self->n + col_index; + self->values[offset] *= value; +} + +inline void matrix_div_scalar(matrix_t *self, size_t row_index, size_t col_index, double value) { + size_t offset = row_index * self->n + col_index; + self->values[offset] /= value; } inline double matrix_get(matrix_t *self, size_t row_index, size_t col_index) { @@ -155,7 +174,7 @@ void matrix_dot_vector(matrix_t *self, double *vec, double *result) { } } -bool matrix_dot_matrix(matrix_t *m1, matrix_t *m2, matrix_t *result) { +inline bool matrix_dot_matrix(matrix_t *m1, matrix_t *m2, matrix_t *result) { if (m1->n != m2->m || m1->m != result->m || m2->n != result->n) { return false; } diff --git a/src/matrix.h b/src/matrix.h index 9d321a80..a6d3bd1e 100644 --- a/src/matrix.h +++ b/src/matrix.h @@ -30,6 +30,10 @@ void matrix_set(matrix_t *self, double value); void matrix_zero(matrix_t *self); void matrix_set_row(matrix_t *self, size_t index, double *row); void matrix_set_scalar(matrix_t *self, size_t row_index, size_t col_index, double value); +void matrix_add_scalar(matrix_t *self, size_t row_index, size_t col_index, double value); +void matrix_sub_scalar(matrix_t *self, size_t row_index, size_t col_index, double value); +void matrix_mul_scalar(matrix_t *self, size_t row_index, size_t col_index, double value); +void matrix_div_scalar(matrix_t *self, size_t row_index, size_t col_index, double value); double matrix_get(matrix_t *self, size_t row_index, size_t col_index); double *matrix_get_row(matrix_t *self, size_t row_index);