<linalg>
ヘッダでは、線形代数(linear algebra)に関する基礎的な演算アルゴリズムを提供する。
ベクトルや行列の成分にアクセスするアルゴリズムは、多次元配列ビュー std::mdspan
を通してその要素にアクセスする。
本ヘッダが提供するエンティティは、すべて名前空間std::linalg
に属する。
1次元データであるベクトル(vector)や2次元データである行列(matrix)に対して、線形代数分野のデファクトスタンダードとされる BLAS(Basic Linear Algebra Subprograms) 互換のアルゴリズム群、いくつかの LAPACK(Linear Algebra PACKage) 互換のアルゴリズムが提供される。 BLAS互換アルゴリズムは、演算対象データの次元数や計算オーダーに応じて3段階に区分される。
- Level 1 BLAS : ベクトルーベクトルの演算
- Level 2 BLAS : 行列ーベクトルの演算
- Level 3 BLAS : 行列ー行列の演算
例えば、2個の一般行列の積を求めるstd::linalg::matrix_product
はLevel 3 BLASルーチンxGEMM
に対応する。
(実際のBLASルーチン名は、浮動小数点数型の単精度S
/倍精度D
とそれぞれの複素数版C
,Z
として、プレフィックスx
部は文字4種類のいずれか。)
また、std::mdspan
と組み合わせて利用する拡張機能が提供される。
共通要件
<linalg>
ヘッダが提供する演算アルゴリズムは、スカラ値およびベクトル/行列の要素型として線形代数値型(linear algebra value types)を取り扱う。
線形代数値型はBLASが取り扱うfloat
, double
, std::complex<float>
, std::complex<double>
をはじめ、semiregular
のモデルであれば良い。
また、線形代数値型の値初期化は加法元(算術型であれば値0
)であること。
プログラム定義型を利用する場合、演算アルゴリズムはカスタマイゼーションポイントとしてabs
, real
, imag
, conj
を非修飾名で呼び出す。
std::mdspan
向け機能拡張
名前 | 説明 | 対応バージョン |
---|---|---|
layout_blas_packed |
行列要素のBLAS互換パックレイアウトに対応するレイアウトマッピングポリシー (class template) | C++26 |
scaled_accessor |
scaled 関数用のアクセサポリシー (class template) |
C++26 |
scaled |
要素値をスカラー倍した読み取り専用std::mdspan を作る (function template) |
C++26 |
conjugated_accessor |
conjugated 関数用のアクセサポリシー (class template) |
C++26 |
conjugated |
読み取り専用の複素共役ビューstd::mdspan を作る (function template) |
C++26 |
layout_transpose |
transposed 関数用のレイアウトマッピングポリシー (class template) |
C++26 |
transposed |
2次元std::mdspan の行列転置ビューを作る (function template) |
C++26 |
conjugate_transposed |
読み取り専用の複素共役転置ビューstd::mdspan を作る (function template) |
C++26 |
BLASの要件
BLAS 1, 2, 3のアルゴリズムでテンプレートパラメータが特に制約されていない場合、テンプレートパラメータの名前によって以下の制約を満たすとする。
名前 | 制約 |
---|---|
ExecutionPolicy |
is_execution_policy<ExecutionPolicy>::value == true |
Real |
complex<Real> が規定できる型 |
Triangle |
upper_triangle_t またはlower_triangle_t |
DiagonalStorage |
implicit_unit_diagonal_t またはexplicit_diagonal_t |
BLAS 1アルゴリズム
std::mpspan
をパラメータに持つ、この節の全てのアルゴリズムの計算量は渡されたstd::mdspan
のextents
の積の最大値、つまりベクトルや行列の要素数の最大値に線形である。
名前 | 説明 | 対応バージョン |
---|---|---|
setup_givens_rotation_result |
setup_givens_rotation の結果型 (class template) |
C++26 |
setup_givens_rotation |
xLARTG: ギブンス回転をセットアップする (function template) | C++26 |
apply_givens_rotation |
xROT: ベクトルにギブンス回転を適用する (function template) | C++26 |
swap_elements |
xSWAP: 2つのベクトル/行列の要素を交換する (function template) | C++26 |
scale |
xSCAL: ベクトル/行列の要素にスカラ値を乗算する (function template) | C++26 |
copy |
xCOPY: ベクトル/行列の要素をコピーする (function template) | C++26 |
add |
xAXPY: 2つのベクトル/行列の要素を加算する (function template) | C++26 |
dot |
xDOT, xDOTU: 2つのベクトルのドット積を求める (function template) | C++26 |
dotc |
xDOTC: 2つのベクトルの複素共役ドット積を求める (function template) | C++26 |
sum_of_squares_result |
vector_sum_of_squares の結果型 (class template) |
C++26 |
vector_sum_of_squares |
xLASSQ: ベクトル要素の平方和を求める (function template) | C++26 |
vector_two_norm |
xNRM2: ベクトルのユークリッドノルム(Euclidean norm)を求める (function template) | C++26 |
vector_abs_sum |
xASUM: ベクトル要素の絶対値和を求める (function template) | C++26 |
vector_idx_abs_max |
xIAMAX: ベクトル要素のうち最大絶対値インデクスを返す (function template) | C++26 |
matrix_frob_norm |
行列のフロベニウスノルム(Frobenius norm)を求める (function template) | C++26 |
matrix_one_norm |
行列の1ノルム(One norm)を求める (function template) | C++26 |
matrix_inf_norm |
行列の無限大ノルム(Infinity norm)を求める (function template) | C++26 |
BLAS 2アルゴリズム
名前 | 説明 | 対応バージョン |
---|---|---|
matrix_vector_product |
xGEMV: 一般行列とベクトルの積を求める (function template) | C++26 |
symmetric_matrix_vector_product |
xSYMV: 対称行列とベクトルの積を求める (function template) | C++26 |
hermitian_matrix_vector_product |
xHEMV: ハミルトニアン行列とベクトルの積を求める (function template) | C++26 |
triangular_matrix_vector_product |
xTRMV: 三角行列とベクトルの積を求める (function template) | C++26 |
triangular_matrix_vector_solve |
xTRSV: 三角行列を係数とする行列方程式を解く (function template) | C++26 |
matrix_rank_1_update |
xGER, xGERU: 行列のRank-1更新 (function template) | C++26 |
matrix_rank_1_update_c |
xGERC: 複素行列のRank-1更新 (function template) | C++26 |
symmetric_matrix_rank_1_update |
xSYR: 対称行列のRank-1更新 (function template) | C++26 |
hermitian_matrix_rank_1_update |
xHER: ハミルトニアン行列のRank-1更新 (function template) | C++26 |
symmetric_matrix_rank_2_update |
xSYR2: 対称行列のRank-2更新 (function template) | C++26 |
hermitian_matrix_rank_2_update |
xHER2: ハミルトニアン行列のRank-2更新 (function template) | C++26 |
BLAS 3アルゴリズム
名前 | 説明 | 対応バージョン |
---|---|---|
matrix_product |
xGEMM: 2つの一般行列の積を求める (function template) | C++26 |
symmetric_matrix_product |
xSYMM: 対称行列と行列の積を求める (function template) | C++26 |
hermitian_matrix_product |
xHEMM: ハミルトニアン行列と行列の積を求める (function template) | C++26 |
triangular_matrix_product |
xTRMM: 三角行列と行列の積を求める (function template) | C++26 |
triangular_matrix_left_product |
xTRMM: In-placeに三角行列と行列の積を求める (function template) | C++26 |
triangular_matrix_right_product |
xTRMM: In-placeに三角行列と行列の積を求める (function template) | C++26 |
symmetric_matrix_rank_k_update |
xSYRK: 対称行列のRank-k更新 (function template) | C++26 |
hermitian_matrix_rank_k_update |
xHERK: ハミルトニアン行列のRank-k更新 (function template) | C++26 |
symmetric_matrix_rank_2k_update |
xSYR2K: 対称行列のRank-2k更新 (function template) | C++26 |
hermitian_matrix_rank_2k_update |
xHER2K: ハミルトニアン行列のRank-2k更新 (function template) | C++26 |
triangular_matrix_matrix_left_solve |
xTRSM: 三角行列の連立一次方程式を解く (function template) | C++26 |
triangular_matrix_matrix_right_solve |
xTRSM: 三角行列の連立一次方程式を解く (function template) | C++26 |
タグ
<linalg>
ヘッダでは、行列の格納順序や三角行列の上下をタグを使って表現している。
格納順序
行列の格納順序を表すタグ。
名前 | 説明 | 対応バージョン |
---|---|---|
column_major_t |
列優先(column-major)を表すタグ型 | C++26 |
column_major |
列優先(column-major)を表すタグ値 | C++26 |
row_major_t |
行優先(row-major)を表すタグ型 | C++26 |
row_major |
行優先(row-major)を表すタグ値 | C++26 |
三角行列
上三角行列か下三角行列かを表すタグ。
名前 | 説明 | 対応バージョン |
---|---|---|
upper_triangle_t |
上三角行列を表すタグ型 | C++26 |
upper_triangle |
上三角行列を表すタグ値 | C++26 |
lower_triangle_t |
下三角行列を表すタグ型 | C++26 |
lower_triangle |
下三角行列を表すタグ値 | C++26 |
対角成分
行列の全ての対角成分を暗黙に乗法における単位元とみなすかどうかを表すタグ。みなした場合、行列の対角成分にはアクセスせず、値が乗法における単位元であるとして計算する。
名前 | 説明 | 対応バージョン |
---|---|---|
implicit_unit_diagonal_t |
全ての対角成分を暗黙に乗法における単位元とみなすタグ型 | C++26 |
implicit_unit_diagonal |
全ての対角成分を暗黙に乗法における単位元とみなすタグ値 | C++26 |
explicit_diagonal_t |
全ての対角成分にアクセスするタグ型 | C++26 |
explicit_diagonal |
全ての対角成分にアクセスするタグ値 | C++26 |
バージョン
言語
- C++26