4.6 KiB
[linalg.transp.transposed]
29 Numerics library [numerics]
29.9 Basic linear algebra algorithms [linalg]
29.9.10 Transpose in-place transformation [linalg.transp]
29.9.10.4 Function template transposed [linalg.transp.transposed]
The transposed function takes a rank-2 mdspan representing a matrix, and returns a new mdspan representing the input matrix's transpose.
The input matrix's data are not modified, and the returned mdspan accesses the input matrix's data in place.
template<class ElementType, class Extents, class Layout, class Accessor> constexpr auto transposed(mdspan<ElementType, Extents, Layout, Accessor> a);
Mandates: Extents::rank() == 2 is true.
Let ReturnExtents betranspose-extents-t.
Let R bemdspan<ElementType, ReturnExtents, ReturnLayout, Accessor>, where ReturnLayout is:
layout_right if Layout is layout_left;
otherwise, layout_left if Layout is layout_right;
otherwise, layout_right_padded if Layout is
layout_left_padded for some size_t value PaddingValue;
otherwise, layout_left_padded if Layout is
layout_right_padded for some size_t value PaddingValue;
otherwise, layout_stride if Layout is layout_stride;
otherwise,layout_blas_packed<OppositeTriangle, OppositeStorageOrder>,
if Layout is
layout_blas_packed<Triangle, StorageOrder> for some Triangle and StorageOrder, where
OppositeTriangle isconditional_t<is_same_v<Triangle, upper_triangle_t>, lower_triangle_t, upper_triangle_t> and
OppositeStorageOrder isconditional_t<is_same_v<StorageOrder, column_major_t>, row_major_t, column_major_t>
otherwise, NestedLayout if Layout is layout_transpose for some NestedLayout;
otherwise, layout_transpose.
Returns: With ReturnMapping being the type typename ReturnLayout::template mapping:
if Layout is layout_left, layout_right, or a specialization of layout_blas_packed,R(a.data_handle(), ReturnMapping(transpose-extents(a.mapping().extents())), a.accessor())
otherwise,R(a.data_handle(), ReturnMapping(transpose-extents(a.mapping().extents()), a.mapping().stride(1)), a.accessor()) if Layout is layout_left_padded for some size_t value PaddingValue;
otherwise,R(a.data_handle(), ReturnMapping(transpose-extents(a.mapping().extents()), a.mapping().stride(0)), a.accessor()) if Layout is layout_right_padded for some size_t value PaddingValue;
otherwise, if Layout is layout_stride,R(a.data_handle(), ReturnMapping(transpose-extents(a.mapping().extents()), array{a.mapping().stride(1), a.mapping().stride(0)}), a.accessor())
otherwise, if Layout is a specialization of layout_transpose,R(a.data_handle(), a.mapping().nested_mapping(), a.accessor())
otherwise,R(a.data_handle(), ReturnMapping(a.mapping()), a.accessor())
[Example 1: void test_transposed(mdspan<double, extents<size_t, 3, 4>> a) {const auto num_rows = a.extent(0); const auto num_cols = a.extent(1); auto a_t = transposed(a); assert(num_rows == a_t.extent(1)); assert(num_cols == a_t.extent(0)); assert(a.stride(0) == a_t.stride(1)); assert(a.stride(1) == a_t.stride(0)); for (size_t row = 0; row < num_rows; ++row) {for (size_t col = 0; col < num_rows; ++col) { assert(a[row, col] == a_t[col, row]); }}auto a_t_t = transposed(a_t); assert(num_rows == a_t_t.extent(0)); assert(num_cols == a_t_t.extent(1)); assert(a.stride(0) == a_t_t.stride(0)); assert(a.stride(1) == a_t_t.stride(1)); for (size_t row = 0; row < num_rows; ++row) {for (size_t col = 0; col < num_rows; ++col) { assert(a[row, col] == a_t_t[row, col]); }}} â end example]