You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.5 KiB
60 lines
1.5 KiB
/* |
|
* N dimensional matrix operations |
|
*/ |
|
|
|
#pragma GCC optimize("O2") |
|
|
|
#include "matrixN.h" |
|
|
|
|
|
// multiply two vectors to give a matrix, in-place |
|
template <typename T, uint8_t N> |
|
void MatrixN<T,N>::mult(const VectorN<T,N> &A, const VectorN<T,N> &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 <typename T, uint8_t N> |
|
MatrixN<T,N> &MatrixN<T,N>::operator -=(const MatrixN<T,N> &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 <typename T, uint8_t N> |
|
MatrixN<T,N> &MatrixN<T,N>::operator +=(const MatrixN<T,N> &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 <typename T, uint8_t N> |
|
void MatrixN<T,N>::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<float,4>::mult(const VectorN<float,4> &A, const VectorN<float,4> &B); |
|
template MatrixN<float,4> &MatrixN<float,4>::operator -=(const MatrixN<float,4> &B); |
|
template MatrixN<float,4> &MatrixN<float,4>::operator +=(const MatrixN<float,4> &B); |
|
template void MatrixN<float,4>::force_symmetry(void);
|
|
|