namespace std::linalg {
template<class ElementType, class Extents, class Layout, class Accessor>
constexpr auto transposed(mdspan<ElementType, Extents, Layout, Accessor> a);
}
概要
行列(matrix)を表現する2次元配列ビューstd::mdspan
に対して、転置行列(transposed matrix)を表現する新しい2次元配列ビューを作る。
本操作によりmdspan
参照先メモリブロックが書き換えられることはなく、戻り値mdspan
を介した要素アクセス時に行/列を入れ替える転置操作が行われる。
適格要件
Extents::rank() == 2
戻り値
説明用の型ReturnExtents
をtranspose-extents-t<Extents>
、型R
をmdspan<ElementType, ReturnExtents, ReturnLayout, Accessor>
、型ReturnLayout
を下記の通りとする。
Layout
がlayout_left
のとき、layout_right
Layout
がlayout_right
のとき、layout_left
Layout
がlayout_left_padded<PaddingValue>
のとき、layout_right_padded<PaddingValue>
Layout
がlayout_right_padded<PaddingValue>
のとき、layout_left_padded<PaddingValue>
Layout
がlayout_stride
のとき、layout_stride
Layout
がlayout_blas_packed<Triangle, StorageOrder>
のとき、layout_blas_packed<OppositeTriangle, OppositeStorageOrder>
OppositeTriangle
はconditional_t<is_same_v<Triangle, upper_triangle_t>, lower_triangle_t, upper_triangle_t>
OppositeStorageOrder
はconditional_t<is_same_v<StorageOrder, column_major_t>, row_major_t, column_major_t>
Layout
がlayout_transpose<NestedLayout>
のとき、NestedLayout
- そうでなければ、
layout_transpose<Layout>
型ReturnMapping
をReturnLayout::mapping<ReturnExtents>
として、次の値を返す。
-
Layout
がlayout_left
またはlayout_right
またはlayout_blas_packed
の特殊化であるとき、R(a.data_handle(), ReturnMapping(transpose-extents(a.mapping().extents())), a.accessor())
-
Layout
がlayout_left_padded<PaddingValue>
であるとき、
R(a.data_handle(),
ReturnMapping(transpose-extents(a.mapping().extents()), a.mapping().stride(1)),
a.accessor())
* transpose-extents[link layout_transpose/transpose-extents.md]
Layout
がlayout_right_padded<PaddingValue>
であるとき、
R(a.data_handle(),
ReturnMapping(transpose-extents(a.mapping().extents()), a.mapping().stride(0)),
a.accessor())
* transpose-extents[link layout_transpose/transpose-extents.md]
-
Layout
がlayout_stride
であるとき、R(a.data_handle(), ReturnMapping(transpose-extents(a.mapping().extents()), array{a.mapping().stride(1), a.mapping().stride(0)}), a.accessor())
-
Layout
がlayout_transpose
の特殊化であるとき、R(a.data_handle(), a.mapping().nested_mapping(), a.accessor())
-
それ以外のとき、
R(a.data_handle(), ReturnMapping(a.mapping()), a.accessor())
例
#include <cassert>
#include <linalg>
#include <mdspan>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6};
std::mdspan mat0{arr, 2, 3};
assert(mat0.extent(0) == 2 && mat0.extent(1) == 3);
// 1 2
// 3 4
// 5 6
auto mat1 = std::linalg::transposed(mat0);
assert(mat1.extent(0) == 3 && mat1.extent(1) == 2);
// 1 3 5
// 2 4 6
// transposed戻り値は書き換え可能なmdspan
mat0[1, 2] = 42; // 6 -> 42
asssert((mat1[2, 1] == 42));
}
24
#include <cassert>
#include <linalg>
#include <mdspan>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6};
std::mdspan mat0{arr, 2, 3};
assert(mat0.extent(0) == 2 && mat0.extent(1) == 3);
// 1 2
// 3 4
// 5 6
auto mat1 = std::linalg::transposed(mat0);
assert(mat1.extent(0) == 3 && mat1.extent(1) == 2);
// 1 3 5
// 2 4 6
出力
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??