24 #include "fwd/Matrix.h"
27 #include "MathUtilities.h"
31 #include <type_traits>
40 template <
typename T,
size_t R,
size_t C>
41 class Matrix :
public std::array<std::array<T, C>, R>
45 constexpr
Matrix(
const std::array<std::array<T, C>, R>& m) noexcept : std::array<std::array<T, C>, R>(m) {}
52 for (
size_t i = 0; i < this->
size(); ++i)
53 this->at(i).fill(element);
57 using std::array<std::array<T, C>, R>::operator=;
61 template <
typename T,
size_t R,
size_t C>
64 if (M.empty() or M.front().empty())
67 for (
const auto& row : M) {
69 for (
const auto& elt : row)
71 s.erase(s.size() - 2, 2);
74 s.erase(s.size() - 2, 2);
80 template <
typename T,
size_t N>
84 for (
size_t i = 0; i < N; ++i)
85 for (
size_t j = 0; j < N; ++j)
91 template <
typename T,
size_t R,
size_t C>
95 for (
size_t r = 0; r < R; ++r)
96 for (
size_t c = 0; c < C; ++c)
102 template <
typename T,
size_t N>
105 SquareMatrix<T, N> u;
106 for (
size_t i = 0; i < N; ++i)
107 for (
size_t j = 0; j < N; ++j)
108 u[i][j] = (T)(i == j);
113 template <
typename T,
size_t N>
116 SquareMatrix<T, N> D = zeroMatrix<T, N, N>();
117 for (
size_t i = 0; i < N; ++i)
124 template <
typename T,
size_t N>
127 size_t diag(0), i(0), j(0);
129 SquareMatrix<T, N> D = zeroMatrix<T, N, N>();
130 for (
const T& el : elements) {
147 template <
typename T,
size_t R,
size_t C>
151 for (
size_t r = 0; r < R; ++r)
152 for (
size_t c = 0; c < C; ++c)
158 template <
typename T,
size_t R,
size_t C>
163 template <
typename T,
size_t R,
size_t K,
size_t C>
164 typename std::enable_if < (R != 1) or (C != 1), Matrix<T, R, C> >::type
168 for (
size_t r = 0; r < R; ++r)
169 for (
size_t c = 0; c < C; ++c)
170 for (
size_t k = 0; k < K; ++k)
171 res[r][c] += A[r][k] * B[k][c];
181 template <
typename T1,
typename T2,
size_t R,
size_t K,
size_t C>
183 ->
const typename std::enable_if < (R != 1) or (C != 1), Matrix<typename std::remove_cv<decltype(operator*(A[0][0], B[0][0]))>::type, R, C> >::type
186 for (
size_t r = 0; r < R; ++r)
187 for (
size_t c = 0; c < C; ++c)
188 for (
size_t k = 0; k < K; ++k)
189 res[r][c] += A[r][k] * B[k][c];
194 template <
typename T,
size_t K>
198 for (
size_t k = 0; k < K; ++k)
199 res += A[0][k] * B[k][0];
204 template <
typename T,
size_t R,
size_t C>
208 for (
auto& elt : row)
214 template <
typename T1,
typename T2,
size_t R,
size_t C>
218 for (
auto& elt : row)
224 template <
typename T,
size_t R,
size_t C>
226 {
auto m = M; m *= c;
return m; }
229 template <
typename T1,
typename T2,
size_t R,
size_t C>
231 {
auto m = M; m *= c;
return m; }
234 template <
typename T1,
typename T2,
size_t R,
size_t C>
239 template <
typename T,
size_t R,
size_t C>
242 for (
size_t r = 0; r < R; ++r)
243 for (
size_t c = 0; c < C; ++c)
244 lhs[r][c] += rhs[r][c];
249 template <
typename T,
size_t R,
size_t C>
251 {
auto m = lhs; m += rhs;
return m; }
254 template <
typename T,
size_t R,
size_t C>
257 for (
size_t r = 0; r < R; ++r)
258 for (
size_t c = 0; c < C; ++c)
259 lhs[r][c] -= rhs[r][c];
264 template <
typename T,
size_t R,
size_t C>
266 {
auto m = lhs; m -= rhs;
return m; }
271 template <
typename T,
size_t N>
272 const SquareMatrix < T, N - 1 >
minor_matrix(
const SquareMatrix<T, N>& M,
size_t r,
size_t c)
274 SquareMatrix < T, N - 1 > m;
275 for (
size_t i = 0; i < N; ++i)
277 for (
size_t j = 0; j < N; ++j)
279 m[i - (size_t)(i > r)][j - (size_t)(j > c)] = M[i][j];
286 template <
typename T,
size_t N>
287 const T
minor_det(
const SquareMatrix<T, N>& M,
size_t r,
size_t c)
293 template <
typename T,
size_t N>
294 const T
cofactor(
const SquareMatrix<T, N>& M,
size_t r,
size_t c)
299 template <
typename T,
size_t N>
300 const T
det(SquareMatrix<T, N> M)
308 return M[0][0] * M[1][1] - M[0][1] * M[1][0];
310 return M[0][0] * M[1][1] * M[2][2]
311 + M[0][1] * M[1][2] * M[2][0]
312 + M[0][2] * M[1][0] * M[2][1]
313 - M[0][2] * M[1][1] * M[2][0]
314 - M[0][0] * M[1][2] * M[2][1]
315 - M[0][1] * M[1][0] * M[2][2];
318 for (
size_t i = 0; i < N; ++i)
325 template <
typename T,
size_t M,
size_t N>
326 const SquareMatrix<T, M>
diagonal_minor(
const SquareMatrix<T, N> m, std::vector<size_t> indices)
328 if (indices.size() != M)
331 SquareMatrix<T, M> dm;
332 for (
size_t r = 0; r < indices.size(); ++r)
333 for (
size_t c = 0; c < indices.size(); ++c)
334 dm[indices[r]][indices[c]] = m[r][c];
339 template <
typename T,
size_t N>
340 const T
trace(
const SquareMatrix<T, N>& M)
343 for (
size_t i = 0; i < N; ++i)
const T det(SquareMatrix< T, N > M)
Definition: Matrix.h:300
Matrix(T element=0)
Definition: Matrix.h:50
Matrix< T, R, C > & operator+=(Matrix< T, R, C > &lhs, const Matrix< T, R, C > &rhs)
addition assignment
Definition: Matrix.h:240
const Matrix< T, C, R > transpose(const Matrix< T, R, C > &M)
transpose a matrix
Definition: Matrix.h:148
const SquareMatrix< T, N > zeroMatrix()
zero square matrix
Definition: Matrix.h:81
const SquareMatrix< T, N > diagonalMatrix(std::array< T, N > d)
diagonal matrix
Definition: Matrix.h:114
const size_t size(const ParameterVector &V)
Definition: Parameter.h:283
const SquareMatrix< T, N > symmetricMatrix(std::initializer_list< T > elements)
Definition: Matrix.h:125
const DataIterator operator-(const DataIterator &lhs, DataIterator::difference_type n)
subraction operator
Definition: DataPartition.h:139
const SquareMatrix< T, N-1 > minor_matrix(const SquareMatrix< T, N > &M, size_t r, size_t c)
Definition: Matrix.h:272
Base class for handling YAP exceptions.
Definition: Exceptions.h:39
const SquareMatrix< T, M > diagonal_minor(const SquareMatrix< T, N > m, std::vector< size_t > indices)
diagonal minor matrix
Definition: Matrix.h:326
const CoordinateSystem< T, N > operator*(const SquareMatrix< T, N > &M, const CoordinateSystem< T, N > &C)
Definition: CoordinateSystem.h:62
constexpr Matrix(const std::array< std::array< T, C >, R > &m) noexcept
Constructor.
Definition: Matrix.h:45
Matrix< T, R, C > & operator-=(Matrix< T, R, C > &lhs, const Matrix< T, R, C > &rhs)
subtraction assignment
Definition: Matrix.h:255
Matrix< T, R, C > & operator*=(Matrix< T, R, C > &M, const T &c)
assignment by multiplication by a single element
Definition: Matrix.h:205
const T minor_det(const SquareMatrix< T, N > &M, size_t r, size_t c)
Definition: Matrix.h:287
std::string to_string(const CachedValue::Status &S)
streaming operator for CachedValue::Status
Definition: CachedValue.cxx:27
const SquareMatrix< T, N > unitMatrix()
unit matrix
Definition: Matrix.h:103
const DataIterator operator+(DataIterator lhs, DataIterator::difference_type n)
addition operator
Definition: DataPartition.h:131
std::string to_string(const Matrix< T, R, C > &M)
Definition: Matrix.h:62
const T trace(const SquareMatrix< T, N > &M)
trace
Definition: Matrix.h:340
const T cofactor(const SquareMatrix< T, N > &M, size_t r, size_t c)
Definition: Matrix.h:294
constexpr int pow_negative_one(int exponent)
optimized function for (-1)^n
Definition: MathUtilities.h:44