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

履歴 編集

function template
<linalg>

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

namespace std::linalg {
  template<in-vector InVec, class Scalar>
  Scalar vector_two_norm(InVec v, Scalar init);          // (1)

  template<class ExecutionPolicy,
           in-vector InVec,
           class Scalar>
  Scalar vector_two_norm(ExecutionPolicy&& exec,
                         InVec v,
                         Scalar init);                   // (2)

  template<in-vector InVec>
  auto vector_two_norm(InVec v);                         // (3)

  template<class ExecutionPolicy, in-vector InVec>
  auto vector_two_norm(ExecutionPolicy&& exec, InVec v); // (4)
}

概要

ベクトルのユークリッドノルムを計算する。

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

適格要件

  • (1), (2): decltype(init + abs-if-needed(declval<typename InVec::value_type>()) * abs-if-needed(declval<typename InVec::value_type>()))Scalarに変換可能。
  • (2), (4): is_execution_policy<ExecutionPolicy>::valuetrue

効果

  • (3), (4): Tdecltype(abs-if-needed(declval<typename InVec::value_type>()) * abs-if-needed(declval<typename InVec::value_type>()))とすると、
    • (3): vector_two_norm(v, T{})を返す。
    • (4): vector_two_norm(std::forward<ExecutionPolicy>(exec), v, T{})を返す。

戻り値

  • (1), (2): nvの次元とすると、以下の式の値を返す。

$$ \sqrt{\sum_{i = 0}^{n - 1} |\verb|v[|i\verb|]||^2 + \verb|init|^2} $$

  • (3), (4): Tdecltype(abs-if-needed(declval<typename InVec::value_type>()) * abs-if-needed(declval<typename InVec::value_type>()))とすると、
    • (3): vector_two_norm(v, T{})を返す。
    • (4): vector_two_norm(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_two_norm(v, 1.0 / 5) << '\n'                      // (1)
            << std::linalg::vector_two_norm(std::execution::par, v, 1.0 / 5) << '\n' // (2)
            << std::linalg::vector_two_norm(v) << '\n'                                // (3)
            << std::linalg::vector_two_norm(std::execution::par, v) << '\n';          // (4)

  return 0;
}

出力

1.46361
1.46361
1.42361
1.42361

バージョン

言語

  • C++26

処理系

関連項目

参照