Базовые алгоритмы линейной алгебры (начиная с C++26)
Базовые алгоритмы линейной алгебры основаны на плотных базовых подпрограммах линейной алгебры (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 (шаблон функции) |
|
(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) | вычисляет произведение треугольных матриц (шаблон функции) |
|
(C++26) | выполняет обновление симметричной матрицы ранга k (шаблон функции) |
|
(C++26) | выполняет обновление эрмитовой матрицы ранга k (шаблон функции) |
|
(C++26) | выполняет обновление симметричной матрицы ранга 2k (шаблон функции) |
|
(C++26) | выполняет обновление эрмитовой матрицы ранга 2k (шаблон функции) |
|
(C++26) | решает несколько треугольных систем линейных уравнений (шаблон функции) |
Вспомогательные элементы |
|
Определено в заголовке <linalg> |
|
Определено в пространстве имён std::linalg |
|
|
(C++26) | описывают порядок элементов в std::mdspan с раскладкой linalg::layout_blas_packed(тег) |
|
(C++26) | указывают, к какой части матрицы — верхнему или нижнему треугольнику — должны обращаться алгоритмы и другие пользователи матрицы (тег) |
|
(C++26) | указывают, должны ли алгоритмы обращаться к диагональным элементам матрицы (тег) |
|
(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 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/linalg