Namespaces
Variants

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
std::mdspan политика доступа, ссылка которой представляет произведение фиксированного масштабирующего коэффициента и ссылки вложенной std::mdspan политики доступа
(шаблон класса)
std::mdspan политика доступа, ссылка которой представляет комплексное сопряжение ссылки вложенной std::mdspan политики доступа
(шаблон класса)
std::mdspan политика компоновки отображения, которая меняет местами два крайних правых индекса, размерности и шаги любой уникальной политики компоновки отображения
(шаблон класса)
(C++26)
возвращает новый только для чтения std::mdspan вычисленный поэлементным произведением масштабирующего коэффициента и соответствующих элементов заданного std::mdspan
(шаблон функции)
(C++26)
возвращает новый только для чтения std::mdspan , элементы которого являются комплексно сопряжёнными соответствующим элементам заданного std::mdspan
(шаблон функции)
(C++26)
возвращает новый std::mdspan , представляющий транспонированную матрицу входного std::mdspan
(шаблон функции)
возвращает представление сопряжённой транспонированной матрицы объекта
(шаблон функции)

Функции BLAS 1 уровня

Определено в заголовке <linalg>
Определено в пространстве имён std::linalg
генерирует вращение плоскости
(шаблон функции)
применяет вращение плоскости к векторам
(шаблон функции)
обменивает все соответствующие элементы матрицы или вектора
(шаблон функции)
(C++26)
перезаписывает матрицу или вектор результатом поэлементного умножения на скаляр
(шаблон функции)
(C++26)
копирует элементы одной матрицы или вектора в другую
(шаблон функции)
(C++26)
поэлементно складывает векторы или матрицы
(шаблон функции)
(C++26)
возвращает некомплексно-сопряжённое скалярное произведение двух векторов
(шаблон функции)
(C++26)
возвращает сопряжённое скалярное произведение двух векторов
(шаблон функции)
возвращает масштабированную сумму квадратов элементов вектора
(шаблон функции)
возвращает евклидову норму вектора
(шаблон функции)
возвращает сумму абсолютных значений элементов вектора
(шаблон функции)
возвращает индекс максимального абсолютного значения элементов вектора
(шаблон функции)
возвращает норму Фробениуса матрицы
(шаблон функции)
возвращает одну норму матрицы
(шаблон функции)
возвращает бесконечную норму матрицы
(шаблон функции)

Функции BLAS 2 уровня

Определено в заголовке <linalg>
Определено в пространстве имён std::linalg
вычисляет матрично-векторное произведение
(шаблон функции)
вычисляет произведение симметричной матрицы на вектор
(шаблон функции)
вычисляет произведение эрмитовой матрицы на вектор
(шаблон функции)
вычисляет треугольное матрично-векторное произведение
(шаблон функции)
решает треугольную линейную систему
(шаблон функции)
выполняет несимметричное неконъюгированное ранговое обновление 1 матрицы
(шаблон функции)
выполняет несимметричное сопряжённое ранговое обновление матрицы первого порядка
(шаблон функции)
выполняет rank-1 обновление симметричной матрицы
(шаблон функции)
выполняет обновление ранга 1 эрмитовой матрицы
(шаблон функции)
выполняет обновление ранга 2 эрмитовой матрицы
(шаблон функции)
выполняет обновление ранга 2 эрмитовой матрицы
(шаблон функции)

Функции BLAS 3 уровня

Определено в заголовке <linalg>
Определено в пространстве имён std::linalg
вычисляет произведение матриц
(шаблон функции)
вычисляет симметричное матричное произведение
(шаблон функции)
вычисляет эрмитово матричное произведение
(шаблон функции)
вычисляет треугольное матричное произведение
(шаблон функции)
выполняет rank-k обновление симметричной матрицы
(шаблон функции)
выполняет rank-k обновление эрмитовой матрицы
(шаблон функции)
выполняет rank-2k обновление симметричной матрицы
(шаблон функции)
выполняет обновление ранга 2k эрмитовой матрицы
(шаблон функции)
решает множественные треугольные линейные системы
(шаблон функции)

Вспомогательные элементы

Определено в заголовке <linalg>
Определено в пространстве имён std::linalg
описывают порядок элементов в std::mdspan с компоновкой linalg::layout_blas_packed
(тег)
определяют, должны ли алгоритмы и другие пользователи матрицы обращаться к верхнему треугольнику или нижнему треугольнику матрицы
(тег)
указывают, должны ли алгоритмы обращаться к диагональным элементам матрицы
(тег)
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