Algoritmos básicos de álgebra lineal (desde C++26)
De cppreference.com
Los algoritmos básicos de álgebra lineal se basan en las densas Subrutinas de Álgebra Lineal Básica (BLAS) que corresponden a un subconjunto del Estándar BLAS . Estos algoritmos que acceden a los elementos de las matrices ven esos elementos a través de std::mdspan que representa un vector o una matriz.
Los algoritmos BLAS se clasifican en tres conjuntos de operaciones llamadas niveles, que generalmente corresponden al grado del polinomio en las complejidades de los algoritmos:
- BLAS 1: Todos los algoritmos con parámetros std::mdspan realizan un recuento de accesos de arraystd::mdspan y operaciones aritméticas que son lineales en el producto máximo de extensiones de cualquier parámetro std::mdspan. Estos algoritmos contienen operaciones vectoriales, como productos escalares, normas y suma de vectores.
- BLAS 2: Todos los algoritmos tienen complejidad general en tiempo cuadrático. Estos algoritmos contienen operaciones de matriz-vector, como multiplicaciones de matriz-vector y un solucionador del sistema lineal triangular.
- BLAS 3: Todos los algoritmos tienen complejidad general en tiempo cúbico. Estos algoritmos contienen operaciones matriz-matriz, como multiplicaciones matriz-matriz y un solucionador de múltiples sistemas lineales triangulares.
Transformaciones in situ | ||
Definido en el archivo de encabezado
<linalg> | ||
Definido en el espacio de nombres
std::linalg | ||
(C++26) |
Política de descriptor de acceso a std::mdspan cuya referencia representa el producto de un factor de escala que está fijo y su referencia a descriptor de acceso a std::mdspan anidada. (plantilla de clase) | |
(C++26) |
Política de descriptor de acceso a std::mdspan cuya referencia representa el conjugado complejo de la referencia de su descriptor de acceso a std::mdspan anidado. (plantilla de clase) | |
(C++26) |
Política de mapeo de diseño a std::mdspan que intercambia los dos índices más a la derecha, dimensiones y avances de cualquier política de mapeo de diseño única. (plantilla de clase) | |
(C++26) |
Devuelve un nuevo std::mdspan de solo lectura calculado por el producto por elementos del factor de escala y los elementos correspondientes del std::mdspan dado. (plantilla de función) | |
(C++26) |
Devuelve un nuevo std::mdspan de solo lectura cuyos elementos son los conjugados complejos de los elementos correspondientes del std::mdspan dado. (plantilla de función) | |
(C++26) |
Devuelve un std::mdspan nuevo que representa la transpuesta de la matriz de entrada por el std::mdspan dado . (plantilla de función) | |
(C++26) |
Devuelve una vista transpuesta conjugada de un objeto. (plantilla de función) | |
Funciones BLAS 1 | ||
Definido en el archivo de encabezado
<linalg> | ||
Definido en el espacio de nombres
std::linalg | ||
(C++26) |
Genera una rotación de plano. (plantilla de función) | |
(C++26) |
Aplica rotación de plano a vectores. (plantilla de función) | |
(C++26) |
Intercambia todos los miembros correspondientes de una matriz o un vector. (plantilla de función) | |
(C++26) |
sobrescribe la matriz o el vector con el resultado de calcular la multiplicación de elemento por elemento por un escalar (plantilla de función) | |
(C++26) |
Copia elementos de una matriz o vector en otra(o). (plantilla de función) | |
(C++26) |
Agrega vectores o matrices elemento por elemento. (plantilla de función) | |
(C++26) |
Devuelve el producto escalar no conjugado de dos vectores. (plantilla de función) | |
(C++26) |
Devuelve el producto escalar conjugado de dos vectores. (plantilla de función) | |
(C++26) |
Devuelve la suma escalada de cuadrados de los elementos del vector. (plantilla de función) | |
(C++26) |
Devuelve la norma euclidiana de un vector. (plantilla de función) | |
(C++26) |
Devuelve la suma de los valores absolutos de los elementos del vector. (plantilla de función) | |
(C++26) |
Devuelve el índice del valor absoluto máximo de los elementos vectoriales. (plantilla de función) | |
(C++26) |
Devuelve la norma de Frobenius de una matriz. (plantilla de función) | |
(C++26) |
Devuelve una norma de una matriz. (plantilla de función) | |
(C++26) |
Devuelve la norma de infinito de una matriz. (plantilla de función) | |
Funciones BLAS 2 | ||
Definido en el archivo de encabezado
<linalg> | ||
Definido en el espacio de nombres
std::linalg | ||
(C++26) |
Calcula el producto matriz-vector. (plantilla de función) | |
Calcula el producto matriz-vector simétrica. (plantilla de función) | ||
Calcula el producto matriz-vector hermitiana. (plantilla de función) | ||
Calcula el producto matriz-vector triangular. (plantilla de función) | ||
Resuelve un sistema lineal triangular. (plantilla de función) | ||
(C++26) |
Realiza una actualización no simétrica, no conjugada, y de rango 1 de una matriz. (plantilla de función) | |
(C++26) |
Realiza una actualización no simétrica, conjugada, y de rango 1 de una matriz. (plantilla de función) | |
Realiza una actualización de rango 1 de una matriz simétrica. (plantilla de función) | ||
Realiza una actualización de una matriz hermitiana de rango 1. (plantilla de función) | ||
Realiza una actualización de rango 2 de una matriz simétrica. (plantilla de función) | ||
Realiza una actualización de rango 2 de una matriz hermitiana. (plantilla de función) | ||
Funciones BLAS 3 | ||
Definido en el archivo de encabezado
<linalg> | ||
Definido en el espacio de nombres
std::linalg | ||
(C++26) |
Calcula el producto matriz-matriz. (plantilla de función) | |
(C++26) |
Calcula el producto matriz-matriz simétrica. (plantilla de función) | |
(C++26) |
Calcula el producto matriz-matriz hermitiana. (plantilla de función) | |
Calcula el producto triangular matriz-matriz. (plantilla de función) | ||
Realiza una actualización de rango k de una matriz simétrica. (plantilla de función) | ||
Realiza una actualización de rango k de una matriz hermitiana. (plantilla de función) | ||
Realiza una actualización de rango 2k de una matriz simétrica. (plantilla de función) | ||
Realiza una actualización de rango 2k de una matriz hermitiana. (plantilla de función) | ||
Resuelve múltiples sistemas lineales triangulares. (plantilla de función) | ||
Elementos auxiliares | ||
Definido en el archivo de encabezado
<linalg> | ||
Definido en el espacio de nombres
std::linalg | ||
Describe el orden de los elementos en un std::mdspan con un diseño linalg::layout_blas_packed. (tag) | ||
Especifica si los algoritmos y otros usuarios de una matriz deben acceder al triángulo superior o al triángulo inferior de la matriz. (tag) | ||
Especifica si los algoritmos deben acceder a las entradas diagonales de la matriz. (tag) | ||
(C++26) |
Política de mapeo de diseño a std::mdspan que representa una matriz cuadrada que almacena solo las entradas en un triángulo, en un formato contiguo empaquetado. (plantilla de clase) |
[editar] Notas
Macro de Prueba de característica | Valor | Estándar | Comentario |
---|---|---|---|
__cpp_lib_linalg |
202311L | (C++26) | Algoritmos básicos de álgebra lineal |
[editar] Ejemplo
Ejecuta este código
#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, ejecutado secuencialmente std::linalg::scale(2.0, x); // x[i] *= 3.0, ejecutado en paralelo 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)); }