Namespaces
Variants

Basic linear algebra algorithms (since C++26)

From cppreference.net

기본 선형 대수 알고리즘은 밀집 기본 선형 대수 서브루틴( BLAS )에 기반하며, 이는 BLAS 표준 의 부분 집합에 해당합니다. 배열 요소에 접근하는 이러한 알고리즘들은 벡터나 행렬을 표현하는 std::mdspan 을 통해 해당 요소들을 조회합니다.

BLAS 알고리즘은 일반적으로 알고리즘 복잡도의 다항식 차수에 해당하는 레벨 이라고 불리는 세 가지 연산 집합으로 분류됩니다:

  • BLAS 1 : std::mdspan 매개변수를 갖는 모든 알고리즘은 std::mdspan 배열 접근과 산술 연산의 횟수를 std::mdspan 매개변수 중 가장 큰 차원 크기의 곱에 대해 선형적으로 수행합니다. 이러한 알고리즘에는 내적, 노름, 벡터 덧셈과 같은 벡터 연산이 포함됩니다.
  • BLAS 2 : 모든 알고리즘은 일반적으로 이차 시간 복잡도를 가집니다. 이러한 알고리즘에는 행렬-벡터 곱셈과 삼각 선형 시스템 솔버와 같은 행렬-벡터 연산이 포함됩니다.
  • BLAS 3 : 모든 알고리즘은 일반적으로 삼차 시간 복잡도를 가집니다. 이러한 알고리즘에는 행렬-행렬 곱셈과 다중 삼각 선형 시스템 솔버와 같은 행렬-행렬 연산이 포함됩니다.

목차

제자리 변환

헤더에 정의됨 <linalg>
정의된 네임스페이스 std::linalg
std::mdspan 접근자 정책으로, 고정된 스케일링 인자와 중첩된 std::mdspan 접근자의 참조를 곱한 값을 참조로 표현함
(클래스 템플릿)
std::mdspan 접근자 정책으로, 참조가 중첩된 std::mdspan 접근자의 참조에 대한 복소 공액을 나타냄
(클래스 템플릿)
std::mdspan 어떤 고유 레이아웃 매핑 정책의 가장 오른쪽 두 인덱스, 범위, 스트라이드를 교환하는 레이아웃 매핑 정책
(클래스 템플릿)
(C++26)
주어진 std::mdspan 의 해당 요소와 스케일링 인자의 요소별 곱으로 계산된 새로운 읽기 전용 std::mdspan 을 반환합니다
(함수 템플릿)
(C++26)
주어진 std::mdspan 의 해당 요소들에 대한 복소 공액(complex conjugate)을 요소로 갖는 새로운 읽기 전용 std::mdspan 을 반환합니다
(함수 템플릿)
(C++26)
주어진 std::mdspan 의 전치 행렬을 나타내는 새로운 std::mdspan 을 반환합니다
(함수 템플릿)
객체의 켤레 전치 뷰를 반환합니다
(함수 템플릿)

BLAS 1 함수

헤더에 정의됨 <linalg>
정의된 네임스페이스 std::linalg
평면 회전 생성
(함수 템플릿)
벡터에 평면 회전을 적용
(함수 템플릿)
행렬 또는 벡터의 모든 대응하는 요소들을 교환
(함수 템플릿)
(C++26)
행렬이나 벡터를 스칼라 곱셈의 요소별 연산 결과로 덮어씁니다
(함수 템플릿)
(C++26)
한 행렬 또는 벡터의 요소들을 다른 행렬이나 벡터로 복사합니다
(함수 템플릿)
(C++26)
벡터나 행렬을 요소별로 더함
(함수 템플릿)
(C++26)
두 벡터의 비켤레 복소수 내적을 반환합니다
(함수 템플릿)
(C++26)
두 벡터의 켤레 내적을 반환합니다
(함수 템플릿)
벡터 요소들의 제곱합에 스케일을 적용한 값을 반환합니다
(함수 템플릿)
벡터의 유클리드 노름을 반환합니다
(함수 템플릿)
벡터 요소들의 절댓값 합을 반환합니다
(함수 템플릿)
벡터 요소의 최대 절댓값 인덱스를 반환
(함수 템플릿)
행렬의 프로베니우스 노름을 반환합니다
(함수 템플릿)
행렬의 1-노름을 반환
(함수 템플릿)
행렬의 무한대 노름을 반환합니다
(함수 템플릿)

BLAS 2 함수

헤더에 정의됨 <linalg>
네임스페이스에 정의됨 std::linalg
행렬-벡터 곱을 계산함
(함수 템플릿)
대칭 행렬-벡터 곱을 계산함
(함수 템플릿)
에르미트 행렬-벡터 곱을 계산함
(함수 템플릿)
삼각 행렬-벡터 곱을 계산함
(함수 템플릿)
삼각 선형 시스템을 해결합니다
(함수 템플릿)
행렬의 비대칭 비켤레 복소수 rank-1 업데이트를 수행합니다
(함수 템플릿)
행렬의 비대칭 켤레 rank-1 업데이트를 수행합니다
(함수 템플릿)
대칭 행렬의 랭크-1 업데이트를 수행합니다
(함수 템플릿)
에르미트 행렬의 랭크-1 업데이트를 수행합니다
(함수 템플릿)
에르미트 행렬의 랭크-2 업데이트를 수행합니다
(함수 템플릿)
에르미트 행렬의 랭크-2 업데이트를 수행합니다
(함수 템플릿)

BLAS 3 함수

헤더에 정의됨 <linalg>
네임스페이스에 정의됨 std::linalg
행렬-행렬 곱을 계산함
(함수 템플릿)
대칭 행렬-행렬 곱을 계산함
(함수 템플릿)
Hermitian 행렬-행렬 곱을 계산합니다
(함수 템플릿)
삼각 행렬-행렬 곱을 계산함
(함수 템플릿)
대칭 행렬의 rank-k 갱신을 수행합니다
(함수 템플릿)
에르미트 행렬의 랭크-k 갱신을 수행합니다
(함수 템플릿)
대칭 행렬의 rank-2k 업데이트를 수행합니다
(함수 템플릿)
에르미트 행렬의 rank-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 기술 포럼