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

履歴 編集

function template
<linalg>

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

namespace std::linalg {
  template<in-vector InVec1,
           in-vector InVec2,
           class Scalar>
  Scalar dot(InVec1 v1,
             InVec2 v2,
             Scalar init); // (1)

  template<class ExecutionPolicy,
           in-vector InVec1,
           in-vector InVec2,
           class Scalar>
  Scalar dot(ExecutionPolicy&& exec,
             InVec1 v1,
             InVec2 v2,
             Scalar init); // (2)

  template<in-vector InVec1,
           in-vector InVec2>
  auto dot(InVec1 v1,
           InVec2 v2); // (3)

  template<class ExecutionPolicy,
           in-vector InVec1,
           in-vector InVec2>
  auto dot(ExecutionPolicy&& exec,
           InVec1 v1,
           InVec2 v2); // (4)
}

概要

2つのベクトルv1v2の内積を計算する。

適格要件

事前条件

2つのベクトルの次元が同じであること。

  • v1.extent(0) == v2.extent(0)

効果

  • (1), (2): なし
  • (3), (4): Tを各ベクトルの値型の積の型decltype(declval<typename InVec1::value_type>() * declval<typename InVec2::value_type>())とする。
    • (3): dot(v1, v2, T{})を返す。
    • (4): dot(std::forward<ExecutionPolicy>(exec), v1, v2, T{})を返す。

戻り値

2つのベクトルの次元をNとする。

  • (1): もしNが0ならinitを返す。そうでない場合は、共役を取らない内積、つまり以下の式のScalar型の値を返す。

$$ \verb|init| + \sum_{i = 0}^{N - 1} \verb|v1|[i] * \verb|v2|[i] $$

  • (2): (1)の並列アルゴリズム版。
  • (3): (1)のinitを和の各項の型のデフォルト値に置き換えて計算する。
  • (4): (3)の並列アルゴリズム版。

備考

  • (1), (2): もしInVec1::value_typeInVec2::value_typeScalarが全て浮動小数点数型またはstd::complexの特殊化で、ScalarInVec1::value_typeInVec2::value_typeより精度が高い場合、和の各項はScalarまたはより高い精度の型が使われる。

[注意] 処理系にあるコンパイラで確認していないため、間違っているかもしれません。

#include <cmath>
#include <execution>
#include <iostream>
#include <linalg>
#include <mdspan>
#include <vector>

int main()
{
  constexpr size_t N = 3;

  std::vector<double> a_vec({1, 2, 3});
  std::mdspan a(a_vec.data(), N);

  std::vector<double> b_vec({4, 5, 6});
  std::mdspan b(b_vec.data(), N);

  std::cout << std::linalg::dot(a, b, -18) << '\n'                      // (1)
            << std::linalg::dot(std::execution::par, a, b, -18) << '\n' // (2)
            << std::linalg::dot(a, b) << '\n'                                // (3)
            << std::linalg::dot(std::execution::par, a, b) << '\n';          // (4)

  return 0;
}

出力

14
14
32
32

バージョン

言語

  • C++26

処理系

関連項目

参照