18template <
class MatrixA,
class MatrixB>
22 const uint n = ioA.GetCols();
23 const uint m = ioB.GetCols();
31 memset(ipiv, 0, n *
sizeof(
int));
33 for (
uint i = 0; i < n; ++i)
36 uint pivot_row = i, pivot_col = i;
39 float largest_element = 0.0f;
40 for (
uint j = 0; j < n; ++j)
42 for (
uint k = 0; k < n; ++k)
46 float element = abs(ioA(j, k));
47 if (element >= largest_element)
49 largest_element = element;
64 if (pivot_row != pivot_col)
66 for (
uint j = 0; j < n; ++j)
67 swap(ioA(pivot_row, j), ioA(pivot_col, j));
68 for (
uint j = 0; j < m; ++j)
69 swap(ioB(pivot_row, j), ioB(pivot_col, j));
73 float diagonal_element = ioA(pivot_col, pivot_col);
74 if (abs(diagonal_element) < inTolerance)
78 for (
uint j = 0; j < n; ++j)
79 ioA(pivot_col, j) /= diagonal_element;
80 for (
uint j = 0; j < m; ++j)
81 ioB(pivot_col, j) /= diagonal_element;
82 ioA(pivot_col, pivot_col) = 1.0f;
86 for (
uint j = 0; j < n; ++j)
89 float element = ioA(j, pivot_col);
90 for (
uint k = 0; k < n; ++k)
91 ioA(j, k) -= ioA(pivot_col, k) * element;
92 for (
uint k = 0; k < m; ++k)
93 ioB(j, k) -= ioB(pivot_col, k) * element;
94 ioA(j, pivot_col) = 0.0f;
#define JPH_STACK_ALLOC(n)
Definition: Core.h:505
unsigned int uint
Definition: Core.h:452
#define JPH_NAMESPACE_END
Definition: Core.h:378
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:372
JPH_NAMESPACE_BEGIN bool GaussianElimination(MatrixA &ioA, MatrixB &ioB, float inTolerance=1.0e-16f)
Definition: GaussianElimination.h:19
#define JPH_ASSERT(...)
Definition: IssueReporting.h:33