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

履歴 編集

function template
<linalg>

std::linalg::transposed(C++26)

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>として、次の値を返す。

  • Layoutlayout_leftまたはlayout_rightまたはlayout_blas_packedの特殊化であるとき、

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

  • 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

処理系

関連項目

参照