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つのベクトルv1
、v2
の内積を計算する。
適格要件
- 共通:
compatible-static-extents<InVec1, InVec2>(0, 0)
がtrue
(2つのベクトルの静的な要素数が同じ)
- (2), (4):
is_execution_policy<ExecutionPolicy>::value
がtrue
事前条件
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{})
を返す。
- (3):
戻り値
2つのベクトルの次元をN
とする。
- (1): もし
N
が0ならinit
を返す。そうでない場合は、共役を取らない内積、つまり以下の式のScalar
型の値を返す。
- (2): (1)の並列アルゴリズム版。
- (3): (1)の
init
を和の各項の型のデフォルト値に置き換えて計算する。 - (4): (3)の並列アルゴリズム版。
備考
- (1), (2): もし
InVec1::value_type
、InVec2::value_type
、Scalar
が全て浮動小数点数型またはstd::complex
の特殊化で、Scalar
がInVec1::value_type
とInVec2::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;
}
xxxxxxxxxx
<< std::linalg::dot(a, b) << '\n' // (3)
#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)
出力
14
14
32
32
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??