39 else if constexpr (N == 2)
41 return A(0, 0) * A(1, 1) - A(0, 1) * A(1, 0);
43 else if constexpr (N == 3)
46 return A(0, 0) * (A(1, 1) * A(2, 2) - A(1, 2) * A(2, 1))
47 - A(0, 1) * (A(1, 0) * A(2, 2) - A(1, 2) * A(2, 0))
48 + A(0, 2) * (A(1, 0) * A(2, 1) - A(1, 1) * A(2, 0));
51 else if constexpr (N == 4)
54 T c0 = A(0, 0) * A(1, 1) - A(0, 1) * A(1, 0);
55 T c1 = A(0, 0) * A(1, 2) - A(0, 2) * A(1, 0);
56 T c2 = A(0, 0) * A(1, 3) - A(0, 3) * A(1, 0);
57 T c3 = A(0, 1) * A(1, 2) - A(0, 2) * A(1, 1);
58 T c4 = A(0, 1) * A(1, 3) - A(0, 3) * A(1, 1);
59 T c5 = A(0, 2) * A(1, 3) - A(0, 3) * A(1, 2);
62 T s0 = A(2, 0) * A(3, 1) - A(2, 1) * A(3, 0);
63 T s1 = A(2, 0) * A(3, 2) - A(2, 2) * A(3, 0);
64 T s2 = A(2, 0) * A(3, 3) - A(2, 3) * A(3, 0);
65 T s3 = A(2, 1) * A(3, 2) - A(2, 2) * A(3, 1);
66 T s4 = A(2, 1) * A(3, 3) - A(2, 3) * A(3, 1);
67 T s5 = A(2, 2) * A(3, 3) - A(2, 3) * A(3, 2);
69 return c0 * s5 - c1 * s4 + c2 * s3 + c3 * s2 - c4 * s1 + c5 * s0;
73 static_assert(is_floating_point_v<T>,
74 "determinant requires a floating-point scalar type for N > 4");
76 auto lu_result =
lu(A);
78 if (!lu_result.has_value())
83 auto &decomp = lu_result.value();
85 T det = T(decomp.sign);
89 det *= decomp.LU(i, i);
Expected< LUResult< T, N >, MatrixStatus > lu(const FusedMatrix< T, N, N > &A, T tol=T(PRECISION_TOLERANCE))
Compute the LU decomposition of a square matrix with partial pivoting.
Definition lu.h:151