# 28 Numerics library [numerics]

## 28.9 Basic linear algebra algorithms [linalg]

### 28.9.6 Layouts for packed matrix types [linalg.layout.packed]

#### 28.9.6.3 Observers [linalg.layout.packed.obs]

```constexpr index_type required_span_size() const noexcept; ```
Returns: extents_.extent(0) * (extents_.extent(0) + 1)/2.
[Note 1:
For example, a 5 x 5 packed matrix only stores 15 matrix elements.
â€” end note]
```template<class Index0, class Index1> constexpr index_type operator() (Index0 ind0, Index1 ind1) const noexcept; ```
Constraints:
• is_convertible_v<Index0, index_type> is true,
• is_convertible_v<Index1, index_type> is true,
• is_nothrow_constructible_v<index_type, Index0> is true, and
• is_nothrow_constructible_v<index_type, Index1> is true.
Let i be extents_type​::​index-cast(ind0), and let j be extents_type​::​index-cast(ind1).
Preconditions: i, j is a multidimensional index in extents_ ([mdspan.overview]).
Returns: Let N be extents_.extent(0).
Then
• (*this)(j, i) if i > j is true; otherwise
• i + j * (j + 1)/2 if is_same_v<StorageOrder, column_major_t> && is_same_v<Triangle, upper_triangle_t> is true or is_same_v<StorageOrder, row_major_t> && is_same_v<Triangle, lower_triangle_t> is true; otherwise
• j + N * i - i * (i + 1)/2.
```constexpr index_type stride(rank_type r) const noexcept; ```
Preconditions:
• is_strided() is true, and
• r < extents_type​::​rank() is true.
Returns: 1.
```template<class OtherExtents> friend constexpr bool operator==(const mapping& x, const mapping<OtherExtents>& y) noexcept; ```
Effects: Equivalent to: return x.extents() == y.extents();