/* * N dimensional matrix operations */ #pragma GCC optimize("O2") #include "matrixN.h" // multiply two vectors to give a matrix, in-place template void MatrixN::mult(const VectorN &A, const VectorN &B) { for (uint8_t i = 0; i < N; i++) { for (uint8_t j = 0; j < N; j++) { v[i][j] = A[i] * B[j]; } } } // subtract B from the matrix template MatrixN &MatrixN::operator -=(const MatrixN &B) { for (uint8_t i = 0; i < N; i++) { for (uint8_t j = 0; j < N; j++) { v[i][j] -= B.v[i][j]; } } return *this; } // add B to the matrix template MatrixN &MatrixN::operator +=(const MatrixN &B) { for (uint8_t i = 0; i < N; i++) { for (uint8_t j = 0; j < N; j++) { v[i][j] += B.v[i][j]; } } return *this; } // Matrix symmetry routine template void MatrixN::force_symmetry(void) { for (uint8_t i = 0; i < N; i++) { for (uint8_t j = 0; j < (i - 1); j++) { v[i][j] = (v[i][j] + v[j][i]) / 2; v[j][i] = v[i][j]; } } } template void MatrixN::mult(const VectorN &A, const VectorN &B); template MatrixN &MatrixN::operator -=(const MatrixN &B); template MatrixN &MatrixN::operator +=(const MatrixN &B); template void MatrixN::force_symmetry(void);