diff --git a/libs/math/include/psemek/math/matrix.hpp b/libs/math/include/psemek/math/matrix.hpp index 21662f82..49bee094 100644 --- a/libs/math/include/psemek/math/matrix.hpp +++ b/libs/math/include/psemek/math/matrix.hpp @@ -437,16 +437,34 @@ namespace psemek::math T frobenius_norm_sqr(matrix const & m) { T r{0}; - for (std::size_t i = 0; i < m.rows(); ++i) - for (std::size_t j = 0; j < m.columns(); ++j) - r += sqr(m[i][j]); + for (auto const & value : m.values()) + r += sqr(value); + return r; + } + + template + T linf_norm(matrix const & m) + { + using std::abs; + using std::max; + T r = abs(m[0][0]); + for (auto const & value : m.values()) + make_max(r, abs(value)); return r; } template T frobenius_norm(matrix const & m) { - return std::sqrt(frobenius_norm_sqr(m)); + T const max = linf_norm(m); + if (max == T(0)) return max; + + T sum{}; + for (auto const & value : m.values()) + sum += sqr(value / max); + + using std::sqrt; + return max * sqrt(sum); } template