最終更新日時: 2024年06月25日 16時29分48秒 (JST)
yoh が更新

履歴 編集

function template
<linalg>

# std::linalg::layout_blas_packed::mapping::operator()(C++26)

    template<class Index0, class Index1>
    constexpr index_type operator() (Index0 ind0, Index1 ind1) const noexcept;

## 概要

2次元インデクス値`ind0, ind1`に対応する要素位置を求める。

## テンプレートパラメータ制約

- `is_convertible_v<Index0, index_type> == true`
- `is_convertible_v<Index1, index_type> == true`
- `is_nothrow_convertible_v<index_type, Index0> == true`
- `is_nothrow_convertible_v<index_type, Index1> == true`

## 事前条件

`i`を`extents_type::index-cast(ind0)`、`j`を`extents_type::index-cast(ind1)`としたとき、2次元インデクス値`i, j`は多次元配列サイズ`extents_`における有効なインデクスであること。

## 戻り値

`N`を`extetns_.extent(0)`としたとき

- `i > j`ならば`(*this)(j, i)`、そうでなければ
- 下記いずれの条件を満たすならば`i + j * (j + 1)/2`、そうでなければ
  - `is_same_v<StorageOrder, column_major_t> && is_same_v<Triangle, upper_triangle_t>`が`true`または
  - `is_same_v<StorageOrder, row_major_t> && is_same_v<Triangle, lower_triangle_t>`が`true`
- `j + N * i - i * (i + 1)/2`

## 例外

投げない

## 例

    #include <cassert>
    #include <mdspan>
    #include <linalg>
    namespace linalg = std::linalg;

    int main()
    {
      using Ext3x3 = std::extents<size_t, 3, 3>;
      linalg::layout_blas_packed<linalg::lower_triangle_t, linalg::column_major_t>::mapping<Ext3x3> map;
      // 0 1 2
      // 1 3 4
      // 2 4 5
      assert(map(0, 0) == 0);
      assert(map(0, 1) == 1);
      assert(map(2, 1) == 4);
    }

### 出力

## バージョン

### 言語

- C++26

### 処理系

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

## 参照

- P1673R13 A free function linear algebra interface based on the BLAS