基本的な線形代数アルゴリズム (C++26から)
From cppreference.com
基本的な線形代数アルゴリズムは、密な基本線形代数サブプログラム (BLAS) に基づいており、これはBLAS標準のサブセットに対応します。これらのアルゴリズムは、配列の要素にアクセスする際に、ベクトルまたは行列を表す std::mdspan を通してそれらの要素をビューします。
BLASアルゴリズムは、「レベル」と呼ばれる3つの操作セットに分類され、これは一般的にアルゴリズムの計算量の多項式の次数に対応します。
- 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) |
任意のユニークなレイアウトマッピングポリシーの右端の2つのインデックス、次元、およびストライドを交換する std::mdspan レイアウトマッピングポリシー (クラステンプレート) | |
| (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) |
行列の非対称な非共役ランク1更新を実行する (関数テンプレート) | |
| (C++26) |
行列の非対称な共役ランク1更新を実行する (関数テンプレート) | |
| 対称行列のランク1更新を実行する (関数テンプレート) | ||
| エルミート行列のランク1更新を実行する (関数テンプレート) | ||
| 対称行列のランク2更新を実行する (関数テンプレート) | ||
| エルミート行列のランク2更新を実行する (関数テンプレート) | ||
BLAS 3 関数 | ||
| ヘッダー
<linalg> で定義 | ||
| 名前空間
std::linalg で定義 | ||
| (C++26) |
行列と行列の積を計算する (関数テンプレート) | |
| (C++26) |
対称行列と行列の積を計算する (関数テンプレート) | |
| (C++26) |
エルミート行列と行列の積を計算する (関数テンプレート) | |
| 三角行列と行列の積を計算する (関数テンプレート) | ||
| 対称行列のランクk更新を実行する (関数テンプレート) | ||
| エルミート行列のランクk更新を実行する (関数テンプレート) | ||
| 対称行列のランク2k更新を実行する (関数テンプレート) | ||
| エルミート行列のランク2k更新を実行する (関数テンプレート) | ||
| 複数の三角線形システムを解く (関数テンプレート) | ||
ヘルパーアイテム | ||
| ヘッダー
<linalg> で定義 | ||
| 名前空間
std::linalg で定義 | ||
| linalg::layout_blas_packed レイアウトを持つ std::mdspan 内の要素の順序を記述する (タグ) | ||
| アルゴリズムや他の行列利用者が、行列の上三角または下三角にアクセスすべきかを指定する (タグ) | ||
| アルゴリズムが対角成分にアクセスすべきかを指定する (タグ) | ||
| (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, executed sequentially std::linalg::scale(2.0, x); // x[i] *= 3.0, executed in parallel 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テクニカルフォーラム |