• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function template
    <linalg>

    std::linalg::dot

    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型の値を返す。

    init+i=0N1v1[i]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

    処理系

    関連項目

    参照