29template<
int M,
int N,
typename T>
class matMxN
39 c[i][j] = (i == j) ? T(1) : T(0);
45 constexpr explicit matMxN(
const vecN<(M < N ? M : N), T>& d)
49 c[i][j] = (i == j) ? d[i] : T(0);
57 static_assert(((M2 > M) && (N2 >= N)) || ((M2 >= M) && (N2 > N)),
58 "matrix must have strictly larger dimensions");
65 static_assert(N == 2,
"wrong #constructor arguments");
72 static_assert(N == 3,
"wrong #constructor arguments");
73 c[0] = x; c[1] = y; c[2] = z;
80 static_assert(N == 4,
"wrong #constructor arguments");
81 c[0] = x; c[1] = y; c[2] = z; c[3] = w;
111 for (
auto i :
xrange(N))
if (x[i] != y[i])
return false;
116 std::array<vecN<M, T>, N> c;
129template<
int M,
int N,
typename T>
133 for (
auto i :
xrange(N)) R[i] =
A[i] +
B[i];
138template<
int M,
int N,
typename T>
142 for (
auto i :
xrange(N)) R[i] =
A[i] -
B[i];
147template<
int M,
int N,
typename T>
154template<
int M,
int N,
typename T>
158 for (
auto i :
xrange(N)) R[i] = x *
A[i];
163template<
int M,
int N,
typename T>
167 for (
auto i :
xrange(N)) R[i] =
A[i] * x;
172template<
int M,
int N,
typename T>
176 for (
auto i :
xrange(N)) r +=
A[i] * x[i];
181template<
int M,
int N,
int O,
typename T>
185 for (
auto i :
xrange(O)) R[i] =
A *
B[i];
190template<
int M,
int N,
typename T>
194 for (
auto i :
xrange(N)) {
195 for (
auto j :
xrange(M)) {
206 return A[0][0] *
A[1][1] -
A[0][1] *
A[1][0];
213 return A[0][0] * (
A[1][1] *
A[2][2] -
A[1][2] *
A[2][1])
214 -
A[1][0] * (
A[0][1] *
A[2][2] -
A[0][2] *
A[2][1])
215 +
A[2][0] * (
A[0][1] *
A[1][2] -
A[0][2] *
A[1][1]);
223 T f0 =
A[2][2] *
A[3][3] -
A[3][2] *
A[2][3];
224 T f1 =
A[2][1] *
A[3][3] -
A[3][1] *
A[2][3];
225 T f2 =
A[2][1] *
A[3][2] -
A[3][1] *
A[2][2];
226 T f3 =
A[2][0] *
A[3][3] -
A[3][0] *
A[2][3];
227 T f4 =
A[2][0] *
A[3][2] -
A[3][0] *
A[2][2];
228 T f5 =
A[2][0] *
A[3][1] -
A[3][0] *
A[2][1];
230 (
A[1][2] * f3 -
A[1][3] * f4 -
A[1][0] * f0),
231 (
A[1][0] * f1 -
A[1][1] * f3 +
A[1][3] * f5),
232 (
A[1][1] * f4 -
A[1][2] * f5 -
A[1][0] * f2));
252 A[0][2] *
A[2][1] -
A[0][1] *
A[2][2],
253 A[0][1] *
A[1][2] -
A[0][2] *
A[1][1]),
255 A[0][0] *
A[2][2] -
A[0][2] *
A[2][0],
256 A[0][2] *
A[1][0] -
A[0][0] *
A[1][2]),
258 A[0][1] *
A[2][0] -
A[0][0] *
A[2][1],
259 A[0][0] *
A[1][1] -
A[0][1] *
A[1][0]));
268 T c00 =
A[2][2] *
A[3][3] -
A[3][2] *
A[2][3];
269 T c02 =
A[1][2] *
A[3][3] -
A[3][2] *
A[1][3];
270 T c03 =
A[1][2] *
A[2][3] -
A[2][2] *
A[1][3];
272 T c04 =
A[2][1] *
A[3][3] -
A[3][1] *
A[2][3];
273 T c06 =
A[1][1] *
A[3][3] -
A[3][1] *
A[1][3];
274 T c07 =
A[1][1] *
A[2][3] -
A[2][1] *
A[1][3];
276 T c08 =
A[2][1] *
A[3][2] -
A[3][1] *
A[2][2];
277 T c10 =
A[1][1] *
A[3][2] -
A[3][1] *
A[1][2];
278 T c11 =
A[1][1] *
A[2][2] -
A[2][1] *
A[1][2];
280 T c12 =
A[2][0] *
A[3][3] -
A[3][0] *
A[2][3];
281 T c14 =
A[1][0] *
A[3][3] -
A[3][0] *
A[1][3];
282 T c15 =
A[1][0] *
A[2][3] -
A[2][0] *
A[1][3];
284 T c16 =
A[2][0] *
A[3][2] -
A[3][0] *
A[2][2];
285 T c18 =
A[1][0] *
A[3][2] -
A[3][0] *
A[1][2];
286 T c19 =
A[1][0] *
A[2][2] -
A[2][0] *
A[1][2];
288 T c20 =
A[2][0] *
A[3][1] -
A[3][0] *
A[2][1];
289 T c22 =
A[1][0] *
A[3][1] -
A[3][0] *
A[1][1];
290 T c23 =
A[1][0] *
A[2][1] -
A[2][0] *
A[1][1];
314 T OneOverDeterminant =
static_cast<T
>(1) /
dot(
A[0], row0);
316 return inverse * OneOverDeterminant;
320template<
int M,
int N,
typename T>
324 for (
auto i :
xrange(N))
t +=
A[i] *
A[i];
329template<
int M,
int N,
typename T>
332 for (
auto j :
xrange(M)) {
333 for (
auto i :
xrange(N)) {
334 os <<
A[i][j] <<
' ';
constexpr matMxN(const vecN< M, T > &x, const vecN< M, T > &y, const vecN< M, T > &z, const vecN< M, T > &w)
constexpr vecN< M, T > & operator[](unsigned i)
friend constexpr bool operator==(const matMxN &x, const matMxN &y)
constexpr matMxN(const vecN<(M< N ? M :N), T > &d)
constexpr matMxN & operator*=(T x)
constexpr const vecN< M, T > & operator[](unsigned i) const
constexpr matMxN(const matMxN< M2, N2, T > &x)
constexpr matMxN & operator*=(const matMxN< N, N, T > &x)
constexpr matMxN & operator-=(const matMxN &x)
constexpr matMxN & operator+=(const matMxN &x)
constexpr matMxN(const vecN< M, T > &x, const vecN< M, T > &y, const vecN< M, T > &z)
constexpr matMxN(const vecN< M, T > &x, const vecN< M, T > &y)
imat3 i3(ivec3(1, 2, 3), ivec3(4, 5, 6), ivec3(7, 8, 9))
constexpr T norm2_2(const matMxN< M, N, T > &A)
constexpr T dot(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr matMxN< M, N, T > operator*(T x, const matMxN< M, N, T > &A)
constexpr matMxN< N, M, T > transpose(const matMxN< M, N, T > &A)
constexpr T sum(const vecN< N, T > &x)
std::ostream & operator<<(std::ostream &os, const matMxN< M, N, T > &A)
constexpr matMxN< 2, 2, T > inverse(const matMxN< 2, 2, T > &A)
constexpr matMxN< M, N, T > operator-(const matMxN< M, N, T > &A, const matMxN< M, N, T > &B)
constexpr T determinant(const matMxN< 2, 2, T > &A)
constexpr matMxN< M, N, T > operator+(const matMxN< M, N, T > &A, const matMxN< M, N, T > &B)
std::array< const EDStorage, 4 > A
constexpr auto xrange(T e)