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 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>
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue