基本线性代数算法 (自 C++26 起)
来自 cppreference.com
基本线性代数算法基于密集的基本线性代数子程序 (BLAS),它对应于 BLAS 标准 的一个子集。这些算法访问数组元素的方式是通过 std::mdspan 来表示向量或矩阵。
BLAS 算法被分为三组操作,称为级别,通常对应于算法复杂度中的多项式次数。
- 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 通过缩放因子和给定 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 范数 (函数模板) | |
(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 布局映射策略,表示仅存储一个三角形中的条目的方形矩阵,采用打包的连续格式 (类模板) |
[编辑] 注释
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__cpp_lib_linalg |
202311L | (C++26) | 基本线性代数算法 |
[编辑] 示例
运行此代码
#include <cassert> #include <cstddef> #include <execution> #include <linalg> #include <mdspan> #include <numeric> #include <vector> int main() { constexpr std::size_t N = 40; std::vector<double> x_vec(N); std::ranges::iota(x_vec, 0); std::mdspan x(x_vec.data(), N); // 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 != N; ++i) assert(x[i] == 6.0 * static_cast<double>(i)); }