namespace std::linalg {
template<in-vector InVec, class Scalar>
Scalar vector_abs_sum(InVec v, Scalar init); // (1)
template<class ExecutionPolicy,
in-vector InVec,
class Scalar>
Scalar vector_abs_sum(ExecutionPolicy&& exec,
InVec v,
Scalar init); // (2)
template<in-vector InVec>
auto vector_abs_sum(InVec v); // (3)
template<class ExecutionPolicy, in-vector InVec>
auto vector_abs_sum(ExecutionPolicy&& exec, InVec v); // (4)
}
概要
ベクトルの各成分の絶対値の和(1ノルム)を計算する。
- (1): 逐次実行する。
- (2): 指定された実行ポリシーに応じて実行する。
- (3): (1)で
init
にInVec::value_type
のデフォルト値を与えて逐次実行する。 - (4): (2)で
init
にInVec::value_type
のデフォルト値を与えて、指定された実行ポリシーに応じて実行する。
適格要件
- (1), (2):
decltype(init + abs-if-needed(real-if-needed(declval<typename InVec::value_type>())) + abs-if-needed(imag-if-needed(declval<typename InVec::value_type>())))
がScalar
に変換可能。 - (2), (4):
is_execution_policy<ExecutionPolicy>::value
がtrue
効果
- (3), (4):
T
をtypename InVec::value_type
とすると、- (3):
vector_abs_sum(v, T{})
を返す。 - (4):
vector_abs_sum(std::forward<ExecutionPolicy>(exec), v, T{})
を返す。
- (3):
戻り値
-
(1), (2):
N
をv
の次元v.extent(0)
とすると、以下を返す。- もし
N
が0ならinit
- そうでない場合、もし
InVec::value_type
が算術型なら以下の式の値
$$ \sum_{i = 0}^{N - 1} |\verb|v[|i\verb|]|| + \verb|init| $$
- そうでない場合、以下の式の値
$$ \sum_{i = 0}^{N - 1} \left\{|\mathrm{Re}(\verb|v[|i\verb|]|)| + |\mathrm{Im}(\verb|v[|i\verb|]|)|\right\} + \verb|init| $$
- もし
-
(3), (4):
T
をtypename InVec::value_type
とすると、- (3):
vector_abs_sum(v, T{})
を返す。 - (4):
vector_abs_sum(std::forward<ExecutionPolicy>(exec), v, T{})
を返す。
- (3):
備考
- (1), (2): もし
InVec::value_type
とScalar
がどちらも浮動小数点数型またはstd::complex
の特殊化で、Scalar
がInVec::value_type
より精度が高い場合、和の各項はScalar
またはより高い精度の型が使われる。
例
[注意] 処理系にあるコンパイラで確認していないため、間違っているかもしれません。
#include <array>
#include <cmath>
#include <execution>
#include <iostream>
#include <linalg>
#include <mdspan>
int main()
{
constexpr size_t N = 4;
std::array<double, N> vec;
std::mdspan v(vec.data(), N);
for(int i = 0; i < v.extent(0); ++i) {
v[i] = std::pow(-1.0, i) / (i + 1);
}
std::cout << std::linalg::vector_abs_sum(v, -5.0 / 6) << '\n' // (1)
<< std::linalg::vector_abs_sum(std::execution::par, v, -5.0 / 6) << '\n' // (2)
<< std::linalg::vector_abs_sum(v) << '\n' // (3)
<< std::linalg::vector_abs_sum(std::execution::par, v) << '\n'; // (4)
return 0;
}
出力
1.25
1.25
2.08333
2.08333
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??