基本線性代數演算法 (自 C++26 起)
出自 cppreference.com
基本線性代數演算法基於稠密基本線性代數子程式 (BLAS),對應於 BLAS 標準的一個子集。這些存取陣列元素的演算法透過代表向量或矩陣的 std::mdspan 來檢視這些元素。
BLAS 演算法被歸類為三個操作集,稱為層級 (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 佈局映射策略,用於交換任何唯一佈局映射策略的最右側兩個索引、維度與步長。 (類別樣板) | |
| (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) |
傳回兩個向量的非共軛點積。 (函式樣板) | |
| (C++26) |
傳回兩個向量的共軛點積。 (函式樣板) | |
| (C++26) |
傳回向量元素的縮放平方和。 (函式樣板) | |
| (C++26) |
傳回向量的歐幾里得範數。 (函式樣板) | |
| (C++26) |
傳回向量元素絕對值的總和。 (函式樣板) | |
| (C++26) |
傳回向量元素中絕對值最大的索引。 (函式樣板) | |
| (C++26) |
傳回矩陣的弗羅貝尼烏斯範數 (Frobenius norm)。 (函式樣板) | |
| (C++26) |
傳回矩陣的 1-範數。 (函式樣板) | |
| (C++26) |
傳回矩陣的無窮範數 (infinity norm)。 (函式樣板) | |
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 技術論壇 |