diff options
Diffstat (limited to 'include/maths')
| -rw-r--r-- | include/maths/complex.h | 28 | ||||
| -rw-r--r-- | include/maths/matrix.h | 36 | ||||
| -rw-r--r-- | include/maths/vector.h | 46 |
3 files changed, 110 insertions, 0 deletions
diff --git a/include/maths/complex.h b/include/maths/complex.h new file mode 100644 index 0000000..c94f64a --- /dev/null +++ b/include/maths/complex.h @@ -0,0 +1,28 @@ +#pragma once + +struct PsiComplex +{ + double real; + double imaginary; +}; + +struct PsiComplex psi_new_complex(double real, double imaginary); +struct PsiComplex psi_new_complex_from_real(double real); + +struct PsiComplex psi_conjugate_complex(struct PsiComplex z); +struct PsiComplex psi_neg_complex(struct PsiComplex z); + +double psi_phase_complex(struct PsiComplex z); +double psi_norm2_complex(struct PsiComplex z); +double psi_abs_complex(struct PsiComplex z); +struct PsiComplex psi_sqrt_complex(struct PsiComplex z); + +struct PsiComplex psi_add_complex(struct PsiComplex a, struct PsiComplex b); +struct PsiComplex psi_sub_complex(struct PsiComplex a, struct PsiComplex b); +struct PsiComplex psi_mul_complex(struct PsiComplex a, struct PsiComplex b); +struct PsiComplex psi_div_complex(struct PsiComplex a, struct PsiComplex b); + +struct PsiComplex psi_add_complex_real(struct PsiComplex a, double b); +struct PsiComplex psi_sub_complex_real(struct PsiComplex a, double b); +struct PsiComplex psi_mul_complex_real(struct PsiComplex a, double b); +struct PsiComplex psi_div_complex_real(struct PsiComplex a, double b); diff --git a/include/maths/matrix.h b/include/maths/matrix.h new file mode 100644 index 0000000..c4e5530 --- /dev/null +++ b/include/maths/matrix.h @@ -0,0 +1,36 @@ +#pragma once + +#include <stddef.h> + +#include "maths/complex.h" +#include "maths/vector.h" + +struct PsiMatrix +{ + struct PsiComplex *data; + size_t rows; + size_t cols; +}; + +struct PsiMatrix psi_new_matrix(size_t rows, size_t cols); +struct PsiMatrix psi_new_matrix_from(const struct PsiComplex *data, size_t rows, size_t cols); +struct PsiMatrix psi_identity_matrix(size_t size); +struct PsiMatrix psi_clone_matrix(struct PsiMatrix m); +void psi_free_matrix(struct PsiMatrix *m); + +#define psi_matrix(rows, cols, ...) \ + psi_new_matrix_from((struct PsiComplex[]){ __VA_ARGS__ }, rows, cols) + +struct PsiComplex psi_get_matrix(struct PsiMatrix m, size_t row, size_t col); +void psi_set_matrix(struct PsiMatrix *m, size_t row, size_t col, struct PsiComplex value); + +struct PsiMatrix psi_dot_matrix(struct PsiMatrix a, struct PsiMatrix b); +struct PsiMatrix psi_kronecker_matrix(struct PsiMatrix a, struct PsiMatrix b); +struct PsiMatrix psi_transpose_matrix(struct PsiMatrix m); +struct PsiMatrix psi_add_matrix(struct PsiMatrix a, struct PsiMatrix b); +struct PsiMatrix psi_sub_matrix(struct PsiMatrix a, struct PsiMatrix b); +struct PsiMatrix psi_scale_matrix(struct PsiMatrix m, struct PsiComplex scalar); + +struct PsiMatrix psi_matrix_from_vector(struct PsiVector v); +struct PsiVector psi_vector_from_matrix(struct PsiMatrix m, enum PsiVectorKind kind); +struct PsiVector psi_mul_vector_matrix(struct PsiVector v, struct PsiMatrix m); diff --git a/include/maths/vector.h b/include/maths/vector.h new file mode 100644 index 0000000..d452ef1 --- /dev/null +++ b/include/maths/vector.h @@ -0,0 +1,46 @@ +#pragma once + +#include <stddef.h> + +#include "maths/complex.h" + +enum PsiVectorKind +{ + PSI_ROW_VECTOR, + PSI_COLUMN_VECTOR, +}; + +struct PsiVector +{ + struct PsiComplex *data; + size_t size; + enum PsiVectorKind kind; +}; + +struct PsiVector psi_new_vector(size_t size, enum PsiVectorKind kind); +struct PsiVector psi_new_vector_from(const struct PsiComplex *data, size_t size, enum PsiVectorKind kind); +struct PsiVector psi_clone_vector(struct PsiVector v); +void psi_free_vector(struct PsiVector *v); + +#define psi_row_vector(...) \ + psi_new_vector_from((struct PsiComplex[]){ __VA_ARGS__ }, \ + sizeof((struct PsiComplex[]){ __VA_ARGS__ }) / sizeof(struct PsiComplex), \ + PSI_ROW_VECTOR) +#define psi_column_vector(...) \ + psi_new_vector_from((struct PsiComplex[]){ __VA_ARGS__ }, \ + sizeof((struct PsiComplex[]){ __VA_ARGS__ }) / sizeof(struct PsiComplex), \ + PSI_COLUMN_VECTOR) + +struct PsiComplex psi_get_vector(struct PsiVector v, size_t index); +void psi_set_vector(struct PsiVector *v, size_t index, struct PsiComplex value); + +struct PsiComplex psi_dot_vector(struct PsiVector a, struct PsiVector b); +struct PsiComplex psi_norm_vector(struct PsiVector v); +struct PsiComplex psi_sum_vector(struct PsiVector v); +struct PsiComplex psi_max_vector(struct PsiVector v); +struct PsiComplex psi_min_vector(struct PsiVector v); + +struct PsiVector psi_add_vector(struct PsiVector a, struct PsiVector b); +struct PsiVector psi_sub_vector(struct PsiVector a, struct PsiVector b); +struct PsiVector psi_scale_vector(struct PsiVector v, struct PsiComplex scalar); +struct PsiVector psi_transpose_vector(struct PsiVector v); |
