最終更新日時: 2024年12月19日 17時26分10秒 (JST)
yoh が更新

履歴 編集

function template
<linalg>

# std::linalg::conjugated(C++26)

    namespace std::linalg {
      template<class ElementType, class Extents, class Layout, class Accessor>
        constexpr auto conjugated(mdspan<ElementType, Extents, Layout, Accessor> a);
    }

## 概要

多次元配列ビュー`std::mdspan`に対して、要素値の複素共役変換を行なった新しい多次元配列ビューを作る。

本操作により`mdspan`参照先メモリブロックが書き換えられることはなく、戻り値 `mdspan`を介した要素アクセス時に複素共役変換が行われる。

## 戻り値

説明用の型`A`を下記の通りとする。

- `Accessor`が`conjugated_accessor`の特殊化のとき、`remove_cvref_t<decltype(a.accessor().nested_accessor())>`
- `remove_cvref_t<ElementType>`が算術型のとき、`Accessor`
- `remove_cvref_t<ElementType>`と等価な型`T`となる任意の部分式`E`に対して、宣言`template<class T> conj(const T&) = delete;`を含むコンテキストでオーバーロード解決が行わた結果`conj(E)`が有効な式ではないとき、`Accessor`
- そうでなければ、`conjugated_accessor<Accessor>`

戻り値は下記の通り。

- `Accessor`が`conjugated_accessor`の特殊化のとき、

      mdspan<typename A::element_type, Extents, Layout, A>(
        a.data_handle(), a.mapping(), a.accessor().nested_accessor())

- `remove_cvref_t<ElementType>`が算術型のとき、`a`

- `remove_cvref_t<ElementType>`と等価な型`T`となる任意の部分式`E`に対して、宣言`template<class T> conj(const T&) = delete;`を含むコンテキストでオーバーロード解決が行わた結果`conj(E)`が有効な式ではないとき、`a`
- そうではないとき、

      mdspan<typename A::element_type, Extents, Layout, A>(
        a.data_handle(), a.mapping(), conjugated_accessor(a.accessor()))

## 例

    #include <cassert>
    #include <complex>
    #include <linalg>
    #include <mdspan>

    int main()
    {
      std::complex<double> arr[] = {{1, 1}, {2, 2}, {3, 3}};
      std::mdspan vec0{arr, 3};
      // 1+i 2+2i 3+3i

      auto vec1 = std::linalg::conjugated(vec0);
      // 1-i 2-2i 3-3i
      assert(real(vec1[0]) == 1 && imag(vec1[0]) == -1);

      // linalg::conjugated適用後のmdspan要素は読み取り専用となり、
      // 例えば vec1[0] = {4, 4}; はコンパイルエラーを引き起こす。
    }

### 出力

## バージョン

### 言語

- C++26

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `mdspan`

## 参照

- P1673R13 A free function linear algebra interface based on the BLAS
- P1674R2: Evolving a Standard C++ Linear Algebra Library from the BLAS
- P3050R2 Fix C++26 by optimizing linalg::conjugated for noncomplex value types