Tatooine
norm.h
Go to the documentation of this file.
1#ifndef TATOOINE_TENSOR_OPERATIONS_NORM_H
2#define TATOOINE_TENSOR_OPERATIONS_NORM_H
3//==============================================================================
4#include <tatooine/math.h>
5//==============================================================================
6namespace tatooine {
7//==============================================================================
8template <typename Tensor, typename T, std::size_t N>
9constexpr auto norm_inf(base_tensor<Tensor, T, N> const& t) -> T {
10 T norm = -std::numeric_limits<T>::max();
11 for (std::size_t i = 0; i < N; ++i) {
12 norm = std::max(norm, std::abs(t(i)));
13 }
14 return norm;
15}
16//------------------------------------------------------------------------------
17template <typename Tensor, typename T, std::size_t N>
18constexpr auto norm1(base_tensor<Tensor, T, N> const& t) {
19 return sum(abs(t));
20}
21//------------------------------------------------------------------------------
22template <typename Tensor, typename T, std::size_t N>
23constexpr auto norm(base_tensor<Tensor, T, N> const& t, unsigned p = 2) -> T {
24 auto n = T(0);
25 for (std::size_t i = 0; i < N; ++i) {
26 n += std::pow(t(i), p);
27 }
28 return std::pow(n, T(1) / T(p));
29}
30//------------------------------------------------------------------------------
32template <typename Tensor, typename T, std::size_t M, std::size_t N>
34 unsigned int const p) {
35 if (p == 2) {
36 return eigenvalues_sym(transposed(A) * A)(N - 1);
37 }
38 return T(0) / T(0);
39}
40//------------------------------------------------------------------------------
42template <typename Tensor, typename T, std::size_t M, std::size_t N>
43constexpr auto norm(base_tensor<Tensor, T, M, N> const& A,
44 unsigned int const p) {
45 return std::sqrt(squared_norm(A, p));
46}
47//------------------------------------------------------------------------------
49template <typename Tensor, typename T, std::size_t M, std::size_t N>
52 T n = 0;
53 for (std::size_t j = 0; j < N; ++j) {
54 for (std::size_t i = 0; i < M; ++i) {
55 n += std::abs(mat(i, j));
56 }
57 }
58 return n;
59}
60//------------------------------------------------------------------------------
62template <typename Tensor, typename T, std::size_t M, std::size_t N>
64 return std::sqrt(squared_norm(mat, tag::frobenius));
65}
66//------------------------------------------------------------------------------
68template <typename Tensor, typename T, std::size_t M, std::size_t N>
69constexpr auto norm1(base_tensor<Tensor, T, M, N> const& mat) {
70 T max = -std::numeric_limits<T>::max();
71 auto const absmat = abs(mat);
72 for (std::size_t i = 0; i < N; ++i) {
73 max = std::max(max, sum(absmat.template slice<1>(i)));
74 }
75 return max;
76}
77//------------------------------------------------------------------------------
79template <typename Tensor, typename T, std::size_t M, std::size_t N>
81 T max = -std::numeric_limits<T>::max();
82 for (std::size_t i = 0; i < M; ++i) {
83 max = std::max(max, sum(abs(mat.template slice<0>(i))));
84 }
85 return max;
86}
87//------------------------------------------------------------------------------
89template <typename Tensor, typename T, std::size_t M, std::size_t N>
92}
93//------------------------------------------------------------------------------
95template <typename Tensor, typename T, std::size_t M, std::size_t N>
96constexpr auto norm(base_tensor<Tensor, T, M, N> const& mat) {
97 return norm(mat, tag::frobenius);
98}
99//==============================================================================
100} // namespace tatooine
101//==============================================================================
102#endif
static constexpr frobenius_t frobenius
Definition: tags.h:79
Definition: algorithm.h:6
constexpr auto abs(arithmetic auto const x)
Definition: math.h:26
constexpr auto norm1(base_tensor< Tensor, T, N > const &t)
Definition: norm.h:18
constexpr auto norm(base_tensor< Tensor, T, N > const &t, unsigned p=2) -> T
Definition: norm.h:23
constexpr auto max(A &&a, B &&b)
Definition: math.h:20
auto transposed(dynamic_tensor auto &&t)
Definition: transposed_tensor.h:170
constexpr auto sum(base_tensor< Tensor, T, VecDim > const &v)
sum of all components of a vector
Definition: tensor_operations.h:110
constexpr auto squared_norm(base_tensor< Tensor, T, M, N > const &A, unsigned int const p)
squared p-norm of a rank-2 tensor
Definition: norm.h:33
constexpr auto eigenvalues_sym(Mat &&A)
Definition: eigenvalues.h:55
constexpr auto norm_inf(base_tensor< Tensor, T, N > const &t) -> T
Definition: norm.h:9
Definition: base_tensor.h:23
Definition: mat.h:14
Definition: tags.h:78