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 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 <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;
}
template <typename T, std::size_t R, std::size_t C>
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>