@@ -253,21 +253,24 @@ namespace omath
253
253
254
254
if constexpr (Rows == 2 )
255
255
return At (0 , 0 ) * At (1 , 1 ) - At (0 , 1 ) * At (1 , 0 );
256
- else
256
+
257
+ if constexpr (Rows > 2 )
257
258
{
258
259
Type det = 0 ;
259
- for (size_t i = 0 ; i < Columns; ++i )
260
+ for (size_t column = 0 ; column < Columns; ++column )
260
261
{
261
- const Type cofactor = (i % 2 == 0 ? 1 : - 1 ) * At (0 , i ) * Minor (0 , i). Determinant ( );
262
+ const Type cofactor = At (0 , column ) * AlgComplement (0 , column );
262
263
det += cofactor;
263
264
}
264
265
return det;
265
266
}
267
+ std::unreachable ();
266
268
}
267
269
268
270
[[nodiscard]]
269
- constexpr Mat<Rows - 1 , Columns - 1 , Type, StoreType> Minor (const size_t row, const size_t column) const
271
+ constexpr Mat<Rows - 1 , Columns - 1 , Type, StoreType> Strip (const size_t row, const size_t column) const
270
272
{
273
+ static_assert (Rows-1 > 0 && Columns-1 > 0 );
271
274
Mat<Rows - 1 , Columns - 1 , Type, StoreType> result;
272
275
for (size_t i = 0 , m = 0 ; i < Rows; ++i)
273
276
{
@@ -285,6 +288,19 @@ namespace omath
285
288
return result;
286
289
}
287
290
291
+ [[nodiscard]]
292
+ constexpr Type Minor (const size_t row, const size_t column) const
293
+ {
294
+ return Strip (row, column).Determinant ();
295
+ }
296
+
297
+ [[nodiscard]]
298
+ constexpr Type AlgComplement (const size_t row, const size_t column) const
299
+ {
300
+ const auto minor = Minor (row, column);
301
+ return (row + column + 2 ) % 2 == 0 ? minor: -minor;
302
+ }
303
+
288
304
[[nodiscard]]
289
305
constexpr const std::array<Type, Rows * Columns>& RawArray () const
290
306
{
@@ -343,6 +359,25 @@ namespace omath
343
359
};
344
360
}
345
361
362
+ [[nodiscard]]
363
+ constexpr std::optional<Mat> Inverted () const
364
+ {
365
+ const auto det = Determinant ();
366
+
367
+ if (det == 0 )
368
+ return std::nullopt;
369
+
370
+ const auto transposed = Transposed ();
371
+ Mat result;
372
+
373
+ for (std::size_t row = 0 ; row < Rows; row++)
374
+ for (std::size_t column = 0 ; column < Rows; column++)
375
+ result.At (row, column) = transposed.AlgComplement (row, column);
376
+
377
+ result /= det;
378
+
379
+ return {result};
380
+ }
346
381
private:
347
382
std::array<Type, Rows * Columns> m_data;
348
383
};
0 commit comments