|
| 1 | +# linalg |
| 2 | +* linalg[meta header] |
| 3 | +* cpp26[meta cpp] |
| 4 | + |
| 5 | +`<linalg>`ヘッダでは、線形代数(linear algebra)に関する基礎的な演算アルゴリズムを提供する。 |
| 6 | +本ヘッダが提供するエンティティは、すべて名前空間`std::linalg`に属する。 |
| 7 | + |
| 8 | +1次元データであるベクトル(vector)や2次元データである行列(matrix)に対して、線形代数分野のデファクトスタンダードとなされる BLAS(Basic Linear Algebra Subprograms) 互換のアルゴリズム、および一部は LAPACK(Linear Algebra PACKage) 互換のアルゴリズム群が提供される。 |
| 9 | +BLAS互換アルゴリズムは、演算対象データの次元数に応じて3段階に区分される。 |
| 10 | + |
| 11 | +- Level 1 BLAS : ベクトルーベクトルの演算 |
| 12 | +- Level 2 BLAS : 行列ーベクトルの演算 |
| 13 | +- Level 3 BLAS : 行列ー行列の演算 |
| 14 | + |
| 15 | +例えば、2個の一般行列の積を求める`std::linalg::matrix_product`はLevel 3 BLASルーチン`xGEMM`に対応する。 |
| 16 | +(実際のBLASルーチン名は、浮動小数点型の単精度`S`/倍精度`D`とそれぞれの複素数版`C`,`Z`として、プレフィックス`x`部は4種類の文字のいずれかになる。) |
| 17 | + |
| 18 | +また、多次元配列ビュー[`std::mdpan`](mdspan/mdspan.md)と組み合わせて利用する拡張機能が提供される。 |
| 19 | + |
| 20 | + |
| 21 | +## `std::mdspan`向け機能拡張 |
| 22 | + |
| 23 | +| 名前 | 説明 | 対応バージョン | |
| 24 | +|------|------|----------------| |
| 25 | +| `layout_blas_packed` | BLAS互換の圧縮行列表現に対応する[レイアウトマッピングポリシー](mdspan/LayoutMappingPolicy.md) (class template) | C++26 | |
| 26 | +| `scaled` | 読み取り専用の要素値をスカラ倍した`std::mdspan`を作る (function template) | C++26 | |
| 27 | +| `scaled_accessor` | `scaled`関数用の[アクセサポリシー](mdspan/AccessorPolicy.md) (class template) | C++26 | |
| 28 | +| `conjugated_accessor` | `conjugated`関数用の[アクセサポリシー](mdspan/AccessorPolicy.md) (class template) | C++26 | |
| 29 | +| `conjugated` | 読み取り専用の複素共役ビュー`std::mdspan`を作る (function template) | C++26 | |
| 30 | +| `layout_transpose` | `transposed`関数用の[レイアウトマッピングポリシー](mdspan/LayoutMappingPolicy.md) (class template) | C++26 | |
| 31 | +| `transposed` | 2次元`std::mdspan`の転置ビューを作る (function template) | C++26 | |
| 32 | +| `conjugate_transposed` | 読み取り専用の複素共役転置ビュー`std::mdspan`を作る (function template) | C++26 | |
| 33 | + |
| 34 | + |
| 35 | +## BLAS 1アルゴリズム |
| 36 | + |
| 37 | +| 名前 | 説明 | 対応バージョン | |
| 38 | +|------|------|----------------| |
| 39 | +| `setup_givens_rotation_result` | `setup_givens_rotation`の結果型 (class template) | C++26 | |
| 40 | +| `setup_givens_rotation` | xLARTG: ギブンス回転をセットアップする (function template) | C++26 | |
| 41 | +| `apply_givens_rotation` | xROT: ベクトルにギブンス回転を適用する (function template) | C++26 | |
| 42 | +| `swap_elements` | xSWAP: 2つのベクトル/行列の要素を交換する (function template) | C++26 | |
| 43 | +| `scale` | xSCAL: ベクトル/行列の要素にスカラ値を乗算する (function template) | C++26 | |
| 44 | +| `copy` | xCOPY: ベクトル/行列の要素をコピー代入する (function template) | C++26 | |
| 45 | +| `add` | xAXPY: 2つのベクトル/行列の要素を加算する (function template) | C++26 | |
| 46 | +| `dot` | xDOT, xDOTU: 2つのベクトルのドット積を求める (function template) | C++26 | |
| 47 | +| `dotc` | xDOTC: 2つのベクトルの複素共役ドット積を求める (function template) | C++26 | |
| 48 | +| `sum_of_squares_result` | `vector_sum_of_squares`の結果型 (class template) | C++26 | |
| 49 | +| `vector_sum_of_squares` | xLASSQ: ベクトル要素の平方和を求める (class template) | C++26 | |
| 50 | +| `vector_two_norm` | xNRM2: ベクトルのユークリッドノルム(Euclidean norm)を求める (class template) | C++26 | |
| 51 | +| `vector_abs_sum` | xASUM: ベクトル要素の絶対値和を求める (class template) | C++26 | |
| 52 | +| `vector_idx_abs_max` | xIAMAX: ベクトル要素のうち最大絶対値インデクスを返す (class template) | C++26 | |
| 53 | +| `matrix_frob_norm` | 行列のフロベニウスノルム(Frobenius norm)を求める (class template) | C++26 | |
| 54 | +| `matrix_one_norm` | 行列の1ノルム(One norm)を求める (class template) | C++26 | |
| 55 | +| `matrix_inf_norm` | 行列の無限大ノルム(Infinity norm)を求める (class template) | C++26 | |
| 56 | + |
| 57 | + |
| 58 | +## BLAS 2アルゴリズム |
| 59 | + |
| 60 | +| 名前 | 説明 | 対応バージョン | |
| 61 | +|------|------|----------------| |
| 62 | +| `matrix_vector_product` | xGEMV: 一般行列とベクトルの積を求める (class template) | C++26 | |
| 63 | +| `symmetric_matrix_vector_product` | xSYMV: 対称行列とベクトルの積を求める (class template) | C++26 | |
| 64 | +| `hermitian_matrix_vector_product` | xHEMV: ハミルトニアン行列とベクトルの積を求める (class template) | C++26 | |
| 65 | +| `triangular_matrix_vector_product` | xTRMV: 三角行列とベクトルの積を求める (class template) | C++26 | |
| 66 | +| `triangular_matrix_vector_solve` | xTRSV: 三角行列を係数とする行列方程式を解く (class template) | C++26 | |
| 67 | +| `matrix_rank_1_update` | xGER, xGERU: 行列のRank-1更新 (class template) | C++26 | |
| 68 | +| `matrix_rank_1_update_c` | xGERC: 複素行列のRank-1更新 (class template) | C++26 | |
| 69 | +| `symmetric_matrix_rank_1_update` | xSYR: 対称行列のRank-1更新 (class template) | C++26 | |
| 70 | +| `hermitian_matrix_rank_1_update` | xHER: ハミルトニアン行列のRank-1更新 (class template) | C++26 | |
| 71 | +| `symmetric_matrix_rank_2_update` | xSYR2: 対称行列のRank-2更新 (class template) | C++26 | |
| 72 | +| `hermitian_matrix_rank_2_update` | xHER2: ハミルトニアン行列のRank-2更新 (class template) | C++26 | |
| 73 | + |
| 74 | + |
| 75 | +## BLAS 3アルゴリズム |
| 76 | + |
| 77 | +| 名前 | 説明 | 対応バージョン | |
| 78 | +|------|------|----------------| |
| 79 | +| `matrix_product` | xGEMM: 2つの一般行列の積を求める (class template) | C++26 | |
| 80 | +| `symmetric_matrix_product` | xSYMM: 対称行列と行列の積を求める (class template) | C++26 | |
| 81 | +| `hermitian_matrix_product` | xHEMM: ハミルトニアン行列と行列の積を求める (class template) | C++26 | |
| 82 | +| `triangular_matrix_product` | xTRMM: 三角行列と行列の積を求める (class template) | C++26 | |
| 83 | +| `triangular_matrix_left_product` | xTRMM: In-placeに三角行列と行列の積を求める (class template) | C++26 | |
| 84 | +| `triangular_matrix_right_product` | xTRMM: In-placeに三角行列と行列の積を求める (class template) | C++26 | |
| 85 | +| `symmetric_matrix_rank_k_update` | xSYRK: 対称行列のRank-k更新 (class template) | C++26 | |
| 86 | +| `hermitian_matrix_rank_k_update` | xHERK: ハミルトニアン行列のRank-k更新 (class template) | C++26 | |
| 87 | +| `symmetric_matrix_rank_2k_update` | xSYR2K: 対称行列のRank-2k更新 (class template) | C++26 | |
| 88 | +| `hermitian_matrix_rank_2k_update` | xHER2K: ハミルトニアン行列のRank-2k更新 (class template) | C++26 | |
| 89 | +| `triangular_matrix_matrix_left_solve` | xTRSM: 三角行列の連立一次方程式を解く (class template) | C++26 | |
| 90 | +| `triangular_matrix_matrix_right_solve` | xTRSM: 三角行列の連立一次方程式を解く (class template) | C++26 | |
| 91 | + |
| 92 | + |
| 93 | +## タグ型 |
| 94 | + |
| 95 | +| 名前 | 説明 | 対応バージョン | |
| 96 | +|------|------|----------------| |
| 97 | +| `column_major_t` | 列優先メモリレイアウトを表現するためのタグ型 (class) | C++26 | |
| 98 | +| `column_major` | 列優先メモリレイアウトを表現するためのタグ値 (variable) | C++26 | |
| 99 | +| `row_major_t` | 行優先メモリレイアウトを表現するためのタグ型 (class) | C++26 | |
| 100 | +| `row_major` | 行優先メモリレイアウトを表現するためのタグ値 (variable) | C++26 | |
| 101 | +| `upper_triangle_t` | 上三角行列を表現するためのタグ型 (class) | C++26 | |
| 102 | +| `upper_triangle` | 上三角行列を表現するためのタグ値 (variable) | C++26 | |
| 103 | +| `lower_triangle_t` | 下三角行列を表現するためのタグ型 (class) | C++26 | |
| 104 | +| `lower_triangle` | 下三角行列を表現するためのタグ値 (variable) | C++26 | |
| 105 | +| `implicit_unit_diagonal_t` | implicit unit diagonalを表現するためのタグ型 (class) | C++26 | |
| 106 | +| `implicit_unit_diagonal` | implicit unit diagonalを表現するためのタグ値 (variable) | C++26 | |
| 107 | +| `explicit_diagonal_t` | explicit diagonalを表現するためのタグ型 (class) | C++26 | |
| 108 | +| `explicit_diagonal` | explicit diagonalを表現するためのタグ値 (variable) | C++26 | |
| 109 | + |
| 110 | + |
| 111 | +## バージョン |
| 112 | +### 言語 |
| 113 | +- C++26 |
| 114 | + |
| 115 | +### 処理系 |
| 116 | +- [Clang](/implementation.md#clang): ?? |
| 117 | +- [GCC](/implementation.md#gcc): ?? |
| 118 | +- [ICC](/implementation.md#icc): ?? |
| 119 | +- [Visual C++](/implementation.md#visual_cpp): ?? |
| 120 | + |
| 121 | + |
| 122 | +## 関連項目 |
| 123 | +- [`<mdspan>`](mdspan.md) |
| 124 | + |
| 125 | + |
| 126 | +## 参照 |
| 127 | +- [P1673R13 A free function linear algebra interface based on the BLAS](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html) |
| 128 | +- [BLAS (Basic Linear Algebra Subprograms)](https://www.netlib.org/blas/) |
0 commit comments