Improve matrix norms computation & add linf_norm
This commit is contained in:
parent
8832700e25
commit
2549d248a5
1 changed files with 22 additions and 4 deletions
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue