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
|
||
|
(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
의 해당 요소들에 대한 복소 공액(complex conjugate)을 요소로 갖는 새로운 읽기 전용
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)
|
행렬의 1-노름을 반환
(함수 템플릿) |
|
|
(C++26)
|
행렬의 무한대 노름을 반환합니다
(함수 템플릿) |
|
BLAS 2 함수 |
||
|
헤더에 정의됨
<linalg>
|
||
|
네임스페이스에 정의됨
std::linalg
|
||
|
(C++26)
|
행렬-벡터 곱을 계산함
(함수 템플릿) |
|
|
(C++26)
|
대칭 행렬-벡터 곱을 계산함
(함수 템플릿) |
|
|
(C++26)
|
에르미트 행렬-벡터 곱을 계산함
(함수 템플릿) |
|
|
(C++26)
|
삼각 행렬-벡터 곱을 계산함
(함수 템플릿) |
|
|
(C++26)
|
삼각 선형 시스템을 해결합니다
(함수 템플릿) |
|
|
(C++26)
|
행렬의 비대칭 비켤레 복소수 rank-1 업데이트를 수행합니다
(함수 템플릿) |
|
|
(C++26)
|
행렬의 비대칭 켤레 rank-1 업데이트를 수행합니다
(함수 템플릿) |
|
|
(C++26)
|
대칭 행렬의 랭크-1 업데이트를 수행합니다
(함수 템플릿) |
|
|
(C++26)
|
에르미트 행렬의 랭크-1 업데이트를 수행합니다
(함수 템플릿) |
|
|
(C++26)
|
에르미트 행렬의 랭크-2 업데이트를 수행합니다
(함수 템플릿) |
|
|
(C++26)
|
에르미트 행렬의 랭크-2 업데이트를 수행합니다
(함수 템플릿) |
|
BLAS 3 함수 |
||
|
헤더에 정의됨
<linalg>
|
||
|
네임스페이스에 정의됨
std::linalg
|
||
|
(C++26)
|
행렬-행렬 곱을 계산함
(함수 템플릿) |
|
|
(C++26)
|
대칭 행렬-행렬 곱을 계산함
(함수 템플릿) |
|
|
(C++26)
|
Hermitian 행렬-행렬 곱을 계산합니다
(함수 템플릿) |
|
|
삼각 행렬-행렬 곱을 계산함
(함수 템플릿) |
||
|
(C++26)
|
대칭 행렬의 rank-k 갱신을 수행합니다
(함수 템플릿) |
|
|
(C++26)
|
에르미트 행렬의 랭크-k 갱신을 수행합니다
(함수 템플릿) |
|
|
(C++26)
|
대칭 행렬의 rank-2k 업데이트를 수행합니다
(함수 템플릿) |
|
|
(C++26)
|
에르미트 행렬의 rank-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 기술 포럼 |