最終更新日時(UTC):
が更新

履歴 編集

function template
<linalg>

std::linalg::vector_abs_sum(C++26)

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)でinitInVec::value_typeのデフォルト値を与えて逐次実行する。
  • (4): (2)でinitInVec::value_typeのデフォルト値を与えて、指定された実行ポリシーに応じて実行する。

適格要件

効果

  • (3), (4): Ttypename InVec::value_typeとすると、
    • (3): vector_abs_sum(v, T{})を返す。
    • (4): vector_abs_sum(std::forward<ExecutionPolicy>(exec), v, T{})を返す。

戻り値

  • (1), (2): Nvの次元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): Ttypename InVec::value_typeとすると、

    • (3): vector_abs_sum(v, T{})を返す。
    • (4): vector_abs_sum(std::forward<ExecutionPolicy>(exec), v, T{})を返す。

備考

  • (1), (2): もしInVec::value_typeScalarがどちらも浮動小数点数型またはstd::complexの特殊化で、ScalarInVec::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

処理系

関連項目

参照