matrixN.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * N dimensional matrix operations
  3. */
  4. #pragma GCC optimize("O2")
  5. #include "matrixN.h"
  6. // multiply two vectors to give a matrix, in-place
  7. template <typename T, uint8_t N>
  8. void MatrixN<T,N>::mult(const VectorN<T,N> &A, const VectorN<T,N> &B)
  9. {
  10. for (uint8_t i = 0; i < N; i++) {
  11. for (uint8_t j = 0; j < N; j++) {
  12. v[i][j] = A[i] * B[j];
  13. }
  14. }
  15. }
  16. // subtract B from the matrix
  17. template <typename T, uint8_t N>
  18. MatrixN<T,N> &MatrixN<T,N>::operator -=(const MatrixN<T,N> &B)
  19. {
  20. for (uint8_t i = 0; i < N; i++) {
  21. for (uint8_t j = 0; j < N; j++) {
  22. v[i][j] -= B.v[i][j];
  23. }
  24. }
  25. return *this;
  26. }
  27. // add B to the matrix
  28. template <typename T, uint8_t N>
  29. MatrixN<T,N> &MatrixN<T,N>::operator +=(const MatrixN<T,N> &B)
  30. {
  31. for (uint8_t i = 0; i < N; i++) {
  32. for (uint8_t j = 0; j < N; j++) {
  33. v[i][j] += B.v[i][j];
  34. }
  35. }
  36. return *this;
  37. }
  38. // Matrix symmetry routine
  39. template <typename T, uint8_t N>
  40. void MatrixN<T,N>::force_symmetry(void)
  41. {
  42. for (uint8_t i = 0; i < N; i++) {
  43. for (uint8_t j = 0; j < (i - 1); j++) {
  44. v[i][j] = (v[i][j] + v[j][i]) / 2;
  45. v[j][i] = v[i][j];
  46. }
  47. }
  48. }
  49. template void MatrixN<float,4>::mult(const VectorN<float,4> &A, const VectorN<float,4> &B);
  50. template MatrixN<float,4> &MatrixN<float,4>::operator -=(const MatrixN<float,4> &B);
  51. template MatrixN<float,4> &MatrixN<float,4>::operator +=(const MatrixN<float,4> &B);
  52. template void MatrixN<float,4>::force_symmetry(void);