Basic linear algebra algorithms (since C++26)
From cppreference.net
基础线性代数算法基于密集基础线性代数子程序( 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)
|
返回矩阵的弗罗贝尼乌斯范数
(函数模板) |
|
|
(C++26)
|
返回矩阵的一范数
(函数模板) |
|
|
(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 技术论坛 |