tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
blas1_vector_two_norm.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2// SPDX-FileCopyrightText: Copyright (C) 2023 Tobias Hienzsch
3
4#ifndef TETL_LINALG_BLAS1_VECTOR_TWO_NORM_HPP
5#define TETL_LINALG_BLAS1_VECTOR_TWO_NORM_HPP
6
7#include <etl/_cmath/sqrt.hpp>
8#include <etl/_linalg/exposition.hpp>
9#include <etl/_type_traits/declval.hpp>
10
11namespace etl::linalg {
12
13/// \ingroup linalg
14template <in_vector InVec, typename Scalar>
15constexpr auto vector_two_norm(InVec v, Scalar init) noexcept -> Scalar
16{
17 auto sum = init;
18 for (typename InVec::index_type i{0}; i < v.extent(0); ++i) {
19 auto const val = detail::abs_if_needed(v(i));
20 auto const square = val * val;
21 sum += square;
22 }
23
24 using etl::sqrt;
25 return static_cast<Scalar>(sqrt(sum));
26}
27
28/// \ingroup linalg
29template <in_vector InVec>
30constexpr auto vector_two_norm(InVec v) noexcept -> typename InVec::value_type
31{
32 using abs_type = decltype(detail::abs_if_needed(declval<typename InVec::value_type>()));
33 using value_type = decltype(declval<abs_type>() * declval<abs_type>());
34 return vector_two_norm(v, value_type{});
35}
36
37} // namespace etl::linalg
38
39#endif // TETL_LINALG_BLAS1_VECTOR_TWO_NORM_HPP
constexpr auto vector_two_norm(InVec v, Scalar init) noexcept -> Scalar
Definition blas1_vector_two_norm.hpp:15
constexpr auto vector_two_norm(InVec v) noexcept -> typename InVec::value_type
Definition blas1_vector_two_norm.hpp:30
Definition accessor_conjugate.hpp:13
Definition adjacent_find.hpp:9