28 using T = linalg::matrix_scalar_t<PMat>;
29 static constexpr std::size_t InputDim = linalg::mat_rows_v<YMat>;
30 static constexpr std::size_t StateDim = linalg::mat_cols_v<YMat>;
31 static_assert(linalg::mat_rows_v<PMat> == StateDim,
32 "P row dimension must match Y column dimension");
33 static_assert(linalg::mat_cols_v<PMat> == StateDim,
34 "P column dimension must match Y column dimension");
36 using KMat = linalg::Matrix<T, InputDim, StateDim>;
37 const auto [
P_inv,
event] = linalg::SymmetricMatrixInverse<PMat>()(
P);
38 if (
event != linalg::NumericalEvent::NONE)
return std::tuple(KMat{},
event);
40 return std::tuple(K, linalg::NumericalEvent::NONE);
58 using T = linalg::matrix_scalar_t<QMat>;
59 static constexpr std::size_t StateDim = linalg::mat_rows_v<WMat>;
60 static constexpr std::size_t MeasurementDim = linalg::mat_cols_v<WMat>;
61 static_assert(linalg::mat_rows_v<QMat> == StateDim,
62 "Q row dimension must match W row dimension");
63 static_assert(linalg::mat_cols_v<QMat> == StateDim,
64 "Q column dimension must match W row dimension");
66 using LMat = linalg::Matrix<T, StateDim, MeasurementDim>;
67 const auto [
Q_inv,
event] = linalg::SymmetricMatrixInverse<QMat>()(
Q);
68 if (
event != linalg::NumericalEvent::NONE)
return std::tuple(LMat{},
event);
70 return std::tuple(L, linalg::NumericalEvent::NONE);