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_rightLayoutがlayout_rightのとき、layout_leftLayoutがlayout_left_padded<PaddingValue>のとき、layout_right_padded<PaddingValue>Layoutがlayout_right_padded<PaddingValue>のとき、layout_left_padded<PaddingValue>Layoutがlayout_strideのとき、layout_strideLayoutが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
assert((mat1[2, 1] == 42));
}
出力
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??