• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function template
    <linalg>

    std::linalg::transposed

    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

    戻り値

    説明用の型ReturnExtentstranspose-extents-t<Extents>、型Rmdspan<ElementType, ReturnExtents, ReturnLayout, Accessor>、型ReturnLayoutを下記の通りとする。

    ReturnMappingReturnLayout::mapping<ReturnExtents>として、次の値を返す。

    R(a.data_handle(),
      ReturnMapping(transpose-extents(a.mapping().extents()), a.mapping().stride(1)),
      a.accessor())
    

    * transpose-extents[link layout_transpose/transpose-extents.md]
    

    R(a.data_handle(),
      ReturnMapping(transpose-extents(a.mapping().extents()), a.mapping().stride(0)),
      a.accessor())
    

    * transpose-extents[link layout_transpose/transpose-extents.md]
    

    • Layoutlayout_strideであるとき、

      R(a.data_handle(),
        ReturnMapping(transpose-extents(a.mapping().extents()),
                      array{a.mapping().stride(1), a.mapping().stride(0)}),
        a.accessor())
      

    • Layoutlayout_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));
    }
    

    出力

    バージョン

    言語

    • C++26

    処理系

    関連項目

    参照