最終更新日時: 2025年08月25日 01時54分17秒 (JST)
Raclamusi が更新

履歴 編集

class template
<linalg>

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

    namespace std::linalg {
      template<class Triangle, class StorageOrder>
      class layout_blas_packed {
        template<class Extents>
        struct mapping;
      };
    }

## 概要

`layout_blas_packed::mapping`は、BLASにおける正方行列(square matrix)パックレイアウトと互換性のあるレイアウトマッピングを表現するクラスである。

`layout_blas_packed<T, SO>::mapping<E>`はトリビアルコピー可能であり、`regular`のモデルである。

### 説明専用メンバ変数

`layout_blas_packed::mapping`クラステンプレートは、下記の説明専用メンバ変数を保持する。

- `extents_` : `extents_type`型の多次元配列サイズ情報

## 適格要件

- `Extents`は`extents`の特殊化であること
- `Extents::rank() == 2`
- 下記いずれかを満たすこと
  - `extents_type::static_extent(0) == dynamic_extent`または
  - `extents_type::static_extent(1) == dynamic_extent`または
  - `extents_type::static_extent(0) == extents_type::static_extent(1)`
- `Extents::rank_dynamic() == 0`のとき、`Ns`を`Extents::static_extent(0)`としたとき値`Ns * (Ns + 1)`を`index_type`型で表現できること。

## メンバ関数

### 構築・破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++26
`(destructor)` | デストラクタ | C++26
`operator=` | コピー代入演算子 | C++26

### 観測

名前 | 説明 | 対応バージョン
--- | --- | ---
`extents` | 多次元配列のサイズ`extents_`を取得する | C++26
`required_span_size` | 要素アクセス範囲を取得する | C++26
`operator()` | 多次元配列インデクスから要素位置へ変換する | C++26
`stride` | 行列サイズ1x1ならば`1` | C++26
`is_unique` | 行列サイズ1x1ならば`true` | C++26
`is_exhaustive` | `true`を返す | C++26
`is_strided` | 行列サイズ1x1ならば`true` | C++26

## 静的メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`is_always_unique` | 行または列の静的要素数が1ならば`true` | C++26
`is_always_exhaustive` | `true`を返す | C++26
`is_always_strided` | `is_always_unique()` | C++26

## メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`extents_type` | `Extents` | C++26
`index_type` | `Extents::index_type` | C++26
`size_type` | `Extents::size_type` | C++26
`rank_type` | `Extents::rank_type` | C++26
`layout_type` | `layout_blas_packed` | C++26

## 非メンバ（Hidden friends）関数

### 比較演算子

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 | C++26
`operator!=` | 非等値比較 (`==`により使用可能) | C++26

## 例

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

    int main()
    {
      double arr[] = {1, 2, 3, 4, 5, 6};

      // 行優先格納順の上三角要素から3x3対称行列を構築
      using Ext2D = std::dextents<size_t, 2>;
      using LayoutPacked = linalg::layout_blas_packed<linalg::upper_triangle_t, linalg::row_major_t>;
      using Mapping = LayoutPacked::mapping<Ext2D>;
      std::mdspan mat{arr, Mapping{Ext2D{3, 3}}};
      // 1 2 3
      // - 4 5
      // - - 6

      for (size_t i = 0; i < mat.extent(0); i++) {
        for (size_t j = 0; j < mat.extent(1); j++) {
          std::print(" {}", mat[i, j]);
        }
        std::println("");
      }
    }

### 出力

     1 2 3
     2 4 5
     3 5 6

## バージョン

### 言語

- C++26

### 処理系

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

## 関連項目

- `mdspan`

## 参照

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