namespace std::linalg {
template<class Triangle, class StorageOrder>
class layout_blas_packed;
}
概要
layout_blas_packed
は、0でない成分だけを配列で過不足なく持つ三角行列を表す、多次元配列ビューmdspan
のレイアウトマッピングポリシークラスであり、BLASにおけるパックレイアウトと互換性がある。
Triangle
: 三角行列の種別を、上三角upper_triangle_t
または下三角lower_triangle_t
から指定する。StorageOrder
: 行列要素の格納順を、列優先column_major_t
または行優先row_major_t
から指定する。
layout_blas_packed
は、BLASの Symmetric Packed (SP), Hermitian Packed (HP), Triangular Packed (TP) で利用される行列レイアウトを表す。
適格要件
Triangle
はupper_triangle_t
またはlower_triangle_t
のいずれかStorageOrder
はcolumn_major_t
またはrow_major_t
のいずれか
メンバ型
名前 | 説明 | 対応バージョン |
---|---|---|
triangle_type |
Triangle |
C++26 |
storage_order_type |
StorageOrder |
C++26 |
mapping |
レイアウトマッピング (class template) | C++26 |
例
#include <linalg>
#include <mdspan>
#include <print>
#include <string_view>
namespace linalg = std::linalg;
// 行列(matrix)の要素表示
template <class T, class E, class L, class A>
void print_mat(std::string_view name, const std::mdspan<T, E, L, A>& mat)
{
static_assert(mat.rank() == 2);
std::println("{}:", name);
for (size_t i = 0; i < mat.extent(0); ++i) {
for (size_t j = 0; j < mat.extent(1); ++j) {
std::print(" {:2}", mat[i, j]);
}
std::println("");
}
}
int main()
{
double arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 列優先格納順の下三角要素から4x4対称行列を構築
std::mdspan<
double,
std::extents<size_t, 4, 4>,
linalg::layout_blas_packed<linalg::lower_triangle_t, linalg::column_major_t>
> mat1{arr};
// 1 - - -
// 2 5 - -
// 3 6 8 -
// 4 7 9 10
print_mat("mat1", mat1);
// 行優先格納順の下三角要素から4x4対称行列を構築
std::mdspan<
double,
std::extents<size_t, 4, 4>,
linalg::layout_blas_packed<linalg::lower_triangle_t, linalg::row_major_t>
> mat2{arr};
// 1 - - -
// 2 3 - -
// 4 5 6 -
// 7 8 9 10
print_mat("mat2", mat2);
}
出力
mat1:
1 2 3 4
2 5 6 7
3 6 8 9
4 7 9 10
mat2:
1 2 4 7
2 3 5 8
4 5 6 9
7 8 9 10
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??