Optimize math::length(vector) to prevent allocations for runtime-sized vectors
This commit is contained in:
parent
a5acb9534b
commit
8832700e25
1 changed files with 10 additions and 4 deletions
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <psemek/math/detail/array.hpp>
|
||||
#include <psemek/math/math.hpp>
|
||||
#include <psemek/util/hash.hpp>
|
||||
#include <psemek/util/span.hpp>
|
||||
|
||||
|
|
@ -286,17 +287,22 @@ namespace psemek::math
|
|||
using std::max;
|
||||
T r = abs(v[0]);
|
||||
for (std::size_t i = 1; i < v.dimension(); ++i)
|
||||
r = max(r, abs(v[i]));
|
||||
make_max(r, abs(v[i]));
|
||||
return r;
|
||||
}
|
||||
|
||||
template <typename T, std::size_t N>
|
||||
T length(vector<T, N> const & v)
|
||||
{
|
||||
T const m = linf_norm(v);
|
||||
if (m == T(0)) return m;
|
||||
T const max = linf_norm(v);
|
||||
if (max == T(0)) return max;
|
||||
|
||||
T sum{};
|
||||
for (auto const & value : v.values())
|
||||
sum += sqr(value / max);
|
||||
|
||||
using std::sqrt;
|
||||
return m * sqrt(length_sqr(v / m));
|
||||
return max * sqrt(sum);
|
||||
}
|
||||
|
||||
template <typename T, std::size_t N>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue