Improve matrix norms computation & add linf_norm

This commit is contained in:
Nikita Lisitsa 2025-12-04 18:11:32 +03:00
parent 8832700e25
commit 2549d248a5

View file

@ -437,16 +437,34 @@ namespace psemek::math
T frobenius_norm_sqr(matrix<T, R, C> const & m) T frobenius_norm_sqr(matrix<T, R, C> const & m)
{ {
T r{0}; T r{0};
for (std::size_t i = 0; i < m.rows(); ++i) for (auto const & value : m.values())
for (std::size_t j = 0; j < m.columns(); ++j) r += sqr(value);
r += sqr(m[i][j]); return r;
}
template <typename T, std::size_t R, std::size_t C>
T linf_norm(matrix<T, R, C> 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; return r;
} }
template <typename T, std::size_t R, std::size_t C> template <typename T, std::size_t R, std::size_t C>
T frobenius_norm(matrix<T, R, C> const & m) T frobenius_norm(matrix<T, R, C> 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 <typename T, std::size_t R, std::size_t C> template <typename T, std::size_t R, std::size_t C>