166 jassert (n == n && n == b.rows && b.isOneColumnVector());
168 auto* x = b.getRawDataPointer();
169 const auto& A = *
this;
175 auto denominator = A (0,0);
180 b (0, 0) /= denominator;
186 auto denominator = A (0, 0) * A (1, 1) - A (0, 1) * A (1, 0);
191 auto factor = (1 / denominator);
192 auto b0 = x[0],
b1 = x[1];
194 x[0] = factor * (A (1, 1) *
b0 - A (0, 1) *
b1);
195 x[1] = factor * (A (0, 0) *
b1 - A (1, 0) *
b0);
201 auto denominator = A (0, 0) * (A (1, 1) * A (2, 2) - A (1, 2) * A (2, 1))
202 + A (0, 1) * (A (1, 2) * A (2, 0) - A (1, 0) * A (2, 2))
203 + A (0, 2) * (A (1, 0) * A (2, 1) - A (1, 1) * A (2, 0));
208 auto factor = 1 / denominator;
209 auto b0 = x[0],
b1 = x[1],
b2 = x[2];
211 x[0] = ( ( A (0, 1) * A (1, 2) - A (0, 2) * A (1, 1)) *
b2
212 + (-A (0, 1) * A (2, 2) + A (0, 2) * A (2, 1)) *
b1
213 + ( A (1, 1) * A (2, 2) - A (1, 2) * A (2, 1)) *
b0) * factor;
215 x[1] = -( ( A (0, 0) * A (1, 2) - A (0, 2) * A (1, 0)) *
b2
216 + (-A (0, 0) * A (2, 2) + A (0, 2) * A (2, 0)) *
b1
217 + ( A (1, 0) * A (2, 2) - A (1, 2) * A (2, 0)) *
b0) * factor;
219 x[2] = ( ( A (0, 0) * A (1, 1) - A (0, 1) * A (1, 0)) *
b2
220 + (-A (0, 0) * A (2, 1) + A (0, 1) * A (2, 0)) *
b1
221 + ( A (1, 0) * A (2, 1) - A (1, 1) * A (2, 0)) *
b0) * factor;
230 for (
size_t j = 0;
j < n; ++
j)
241 for (
size_t k = 0; k < n; ++k)
242 M (
j, k) +=
M (i, k);
247 auto t = 1 /
M (
j,
j);
249 for (
size_t k = 0; k < n; ++k)
254 for (
size_t k =
j + 1; k < n; ++k)
258 for (
size_t l = 0;
l < n; ++
l)
259 M (k,
l) += u *
M (
j,
l);
265 for (
int k =
static_cast<int> (n) - 2; k >= 0; --k)
266 for (
size_t i =
static_cast<size_t> (k) + 1; i < n; ++i)
267 x[k] -=
M (
static_cast<size_t> (k), i) * x[i];
constexpr bool approximatelyEqual(Type a, Type b, Tolerance< Type > tolerance=Tolerance< Type >{} .withAbsolute(std::numeric_limits< Type >::min()) .withRelative(std::numeric_limits< Type >::epsilon()))
Returns true if the two floating-point numbers are approximately equal.