Basic linear algebra algorithms (since C++26)
From ru.cppreference.net
Базовые алгоритмы линейной алгебры основаны на плотных базовых подпрограммах линейной алгебры ( BLAS ), которые соответствуют подмножеству стандарта BLAS . Эти алгоритмы, обращающиеся к элементам массивов, рассматривают эти элементы через std::mdspan , представляющий вектор или матрицу.
Алгоритмы BLAS классифицируются на три набора операций, называемых уровнями , которые обычно соответствуют степени полинома в сложности алгоритмов:
- BLAS 1 : Все алгоритмы с параметрами std::mdspan выполняют подсчёт обращений к массивам std::mdspan и арифметических операций, которые являются линейными относительно максимального произведения размерностей любого параметра std::mdspan . Эти алгоритмы включают векторные операции, такие как скалярные произведения, нормы и сложение векторов.
- BLAS 2 : Все алгоритмы имеют общую сложность квадратичного времени. Эти алгоритмы включают матрично-векторные операции, такие как умножение матрицы на вектор и решение треугольной системы линейных уравнений.
- BLAS 3 : Все алгоритмы имеют общую сложность кубического времени. Эти алгоритмы включают матрично-матричные операции, такие как умножение матриц и решение множественных треугольных систем линейных уравнений.
In-place преобразования |
||
|
Определено в заголовке
<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)
|
выполняет несимметричное сопряжённое ранговое обновление матрицы первого порядка
(шаблон функции) |
|
|
(C++26)
|
выполняет rank-1 обновление симметричной матрицы
(шаблон функции) |
|
|
(C++26)
|
выполняет обновление ранга 1 эрмитовой матрицы
(шаблон функции) |
|
|
(C++26)
|
выполняет обновление ранга 2 эрмитовой матрицы
(шаблон функции) |
|
|
(C++26)
|
выполняет обновление ранга 2 эрмитовой матрицы
(шаблон функции) |
|
Функции BLAS 3 уровня |
||
|
Определено в заголовке
<linalg>
|
||
|
Определено в пространстве имён
std::linalg
|
||
|
(C++26)
|
вычисляет произведение матриц
(шаблон функции) |
|
|
(C++26)
|
вычисляет симметричное матричное произведение
(шаблон функции) |
|
|
(C++26)
|
вычисляет эрмитово матричное произведение
(шаблон функции) |
|
|
вычисляет треугольное матричное произведение
(шаблон функции) |
||
|
(C++26)
|
выполняет rank-k обновление симметричной матрицы
(шаблон функции) |
|
|
(C++26)
|
выполняет rank-k обновление эрмитовой матрицы
(шаблон функции) |
|
|
(C++26)
|
выполняет rank-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 |