Basic linear algebra algorithms (since C++26)
From cppreference.net
基本的な線形代数アルゴリズムは、密行列基本線形代数サブルーチン( BLAS )に基づいており、これは BLAS Standard のサブセットに対応します。これらのアルゴリズムは、配列の要素にアクセスする際に、ベクトルまたは行列を表現する std::mdspan を通してそれらの要素を参照します。
BLASアルゴリズムは、一般にアルゴリズムの複雑性における多項式の次数に対応する3つの演算セット、 levels に分類されます:
- BLAS 1 : std::mdspan パラメータを持つすべてのアルゴリズムは、いずれかの std::mdspan パラメータのエクステントの最大積に対して 線形 となる回数の std::mdspan 配列アクセスと算術演算を実行します。これらのアルゴリズムには、ドット積、ノルム、ベクトル加算などの ベクトル 演算が含まれます。
- BLAS 2 : すべてのアルゴリズムは一般的に 二次 時間の計算量を持ちます。これらのアルゴリズムには、行列-ベクトル乗算や三角線形システムの解法などの 行列-ベクトル 演算が含まれます。
- BLAS 3 : すべてのアルゴリズムは一般的に 三次 時間の計算量を持ちます。これらのアルゴリズムには、行列-行列乗算や複数三角線形システムの解法などの 行列-行列 演算が含まれます。
インプレース変換 |
||
|
ヘッダーで定義
<linalg>
|
||
|
名前空間
std::linalg
で定義
|
||
|
(C++26)
|
std::mdspan
アクセサーポリシーで、その参照は固定されたスケーリング係数とネストされた
std::mdspan
アクセサーの参照の積を表す
(クラステンプレート) |
|
|
(C++26)
|
std::mdspan
アクセサーポリシーで、その参照がネストされた
std::mdspan
アクセサーの参照の複素共役を表す
(クラステンプレート) |
|
|
(C++26)
|
std::mdspan
任意のユニークなレイアウトマッピングポリシーの右端2つのインデックス、エクステント、ストライドを交換するレイアウトマッピングポリシー
(クラステンプレート) |
|
|
(C++26)
|
指定された
std::mdspan
の対応する要素とスケーリング係数の要素ごとの積によって計算された新しい読み取り専用の
std::mdspan
を返す
(関数テンプレート) |
|
|
(C++26)
|
指定された
std::mdspan
の対応する要素の複素共役を要素とする新しい読み取り専用の
std::mdspan
を返す
(関数テンプレート) |
|
|
(C++26)
|
指定された
std::mdspan
の転置行列を表す新しい
std::mdspan
を返す
(関数テンプレート) |
|
|
(C++26)
|
オブジェクトの共役転置ビューを返す
(関数テンプレート) |
|
BLAS 1 関数 |
||
|
ヘッダーで定義
<linalg>
|
||
|
名前空間
std::linalg
で定義
|
||
|
(C++26)
|
平面回転を生成する
(関数テンプレート) |
|
|
(C++26)
|
ベクトルに平面回転を適用する
(関数テンプレート) |
|
|
(C++26)
|
行列またはベクトルの対応する全要素を交換する
(関数テンプレート) |
|
|
(C++26)
|
行列またはベクトルをスカラーによる要素ごとの乗算結果で上書きする
(関数テンプレート) |
|
|
(C++26)
|
行列またはベクトルの要素を別の行列またはベクトルにコピーする
(関数テンプレート) |
|
|
(C++26)
|
ベクトルまたは行列を要素ごとに加算する
(関数テンプレート) |
|
|
(C++26)
|
2つのベクトルの非共役ドット積を返す
(関数テンプレート) |
|
|
(C++26)
|
2つのベクトルの共役ドット積を返す
(関数テンプレート) |
|
|
(C++26)
|
ベクトル要素のスケーリングされた二乗和を返す
(関数テンプレート) |
|
|
(C++26)
|
ベクトルのユークリッドノルムを返す
(関数テンプレート) |
|
|
(C++26)
|
ベクトル要素の絶対値の合計を返す
(関数テンプレート) |
|
|
(C++26)
|
ベクトル要素の最大絶対値のインデックスを返す
(関数テンプレート) |
|
|
(C++26)
|
行列のフロベニウスノルムを返す
(関数テンプレート) |
|
|
(C++26)
|
行列の1ノルムを返す
(関数テンプレート) |
|
|
(C++26)
|
行列の無限大ノルムを返す
(関数テンプレート) |
|
BLAS 2 関数 |
||
|
ヘッダーで定義
<linalg>
|
||
|
名前空間
std::linalg
で定義
|
||
|
(C++26)
|
行列ベクトル積を計算する
(関数テンプレート) |
|
|
(C++26)
|
対称行列-ベクトル積を計算する
(関数テンプレート) |
|
|
(C++26)
|
エルミート行列-ベクトル積を計算する
(関数テンプレート) |
|
|
(C++26)
|
三角行列-ベクトル積を計算する
(関数テンプレート) |
|
|
(C++26)
|
三角行列線形システムを解く
(関数テンプレート) |
|
|
(C++26)
|
行列の非対称非共役ランク1更新を実行する
(関数テンプレート) |
|
|
(C++26)
|
行列の非対称共役ランク1更新を実行する
(関数テンプレート) |
|
|
(C++26)
|
対称行列のランク1更新を実行する
(関数テンプレート) |
|
|
(C++26)
|
エルミート行列のランク1更新を実行する
(関数テンプレート) |
|
|
(C++26)
|
対称行列のランク2更新を実行する
(関数テンプレート) |
|
|
(C++26)
|
エルミート行列のランク2更新を実行する
(関数テンプレート) |
|
BLAS 3 関数 |
||
|
ヘッダーで定義
<linalg>
|
||
|
名前空間
std::linalg
で定義
|
||
|
(C++26)
|
行列-行列積を計算する
(関数テンプレート) |
|
|
(C++26)
|
対称行列-行列積を計算する
(関数テンプレート) |
|
|
(C++26)
|
エルミート行列-行列積を計算する
(関数テンプレート) |
|
|
三角行列-行列積を計算する
(関数テンプレート) |
||
|
(C++26)
|
対称行列のランクk更新を実行する
(関数テンプレート) |
|
|
(C++26)
|
エルミート行列のランクk更新を実行する
(関数テンプレート) |
|
|
(C++26)
|
対称行列のランク2k更新を実行する
(関数テンプレート) |
|
|
(C++26)
|
エルミート行列のランク2k更新を実行する
(関数テンプレート) |
|
|
複数の三角線形システムを解く
(関数テンプレート) |
||
ヘルパーアイテム |
||
|
ヘッダーで定義
<linalg>
|
||
|
名前空間
std::linalg
で定義
|
||
|
std::mdspan
の要素順序を記述する
linalg::layout_blas_packed
レイアウト
(タグ) |
||
|
行列の上三角部分または下三角部分にアルゴリズムやその他のユーザーがアクセスするかどうかを指定する
(タグ) |
||
|
行列の対角要素にアルゴリズムがアクセスするかどうかを指定する
(タグ) |
||
|
(C++26)
|
std::mdspan
正方行列の一方の三角部分のみをパックされた連続形式で格納するレイアウトマッピングポリシー
(クラステンプレート) |
|
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_linalg
|
202311L
|
(C++26) | 基本線形代数アルゴリズム (BLAS) |
例
このコードを実行
#include <cassert> #include <cstddef> #include <execution> #include <linalg> #include <mdspan> #include <numeric> #include <vector> int main() { std::vector<double> x_vec(42); std::ranges::iota(x_vec, 0.0); std::mdspan x(x_vec.data(), x_vec.size()); // x[i] *= 2.0, 逐次実行 std::linalg::scale(2.0, x); // x[i] *= 3.0, 並列実行 std::linalg::scale(std::execution::par_unseq, 3.0, x); for (std::size_t i{}; i != x.size(); ++i) assert(x[i] == 6.0 * static_cast<double>(i)); }
外部リンク
| 1. | BLAS ホームページ |
| 2. | BLAS テクニカルフォーラム |