[linalg.scaled]

# 29 Numerics library [[numerics]](./#numerics)

## 29.9 Basic linear algebra algorithms [[linalg]](linalg#scaled)

### 29.9.8 Scaled in-place transformation [linalg.scaled]

#### [29.9.8.1](#intro) Introduction [[linalg.scaled.intro]](linalg.scaled.intro)

[1](#intro-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12572)

The scaled function
takes a value alpha and an mdspan x, and
returns a new read-only mdspan that represents
the elementwise product of alpha with each element of x[.](#intro-1.sentence-1)

[*Example [1](#intro-example-1)*: using Vec = mdspan<double, dextents<size_t, 1>>;

// z = alpha * x + yvoid z_equals_alpha_times_x_plus_y(double alpha, Vec x, Vec y, Vec z) { add(scaled(alpha, x), y, z);}// z = alpha * x + beta * yvoid z_equals_alpha_times_x_plus_beta_times_y(double alpha, Vec x, double beta, Vec y, Vec z) { add(scaled(alpha, x), scaled(beta, y), z);} â *end example*]

#### [29.9.8.2](#scaledaccessor) Class template scaled_accessor [[linalg.scaled.scaledaccessor]](linalg.scaled.scaledaccessor)

[1](#scaledaccessor-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12596)

The class template scaled_accessor is an mdspan accessor policy
which upon access produces scaled elements[.](#scaledaccessor-1.sentence-1)

It is part of the implementation of scaled ([[linalg.scaled.scaled]](#scaled "29.9.8.3 Function template scaled"))[.](#scaledaccessor-1.sentence-2)

namespace std::linalg {template<class ScalingFactor, class NestedAccessor>class [scaled_accessor](#lib:scaled_accessor "29.9.8.2 Class template scaled_­accessor [linalg.scaled.scaledaccessor]") {public:using element_type = add_const_t<decltype(declval<ScalingFactor>() * declval<NestedAccessor::element_type>())>; using reference = remove_const_t<element_type>; using data_handle_type = NestedAccessor::data_handle_type; using offset_policy = scaled_accessor<ScalingFactor, NestedAccessor::offset_policy>; constexpr scaled_accessor() = default; template<class OtherNestedAccessor>explicit(!is_convertible_v<OtherNestedAccessor, NestedAccessor>)constexpr scaled_accessor(const scaled_accessor<ScalingFactor,
 OtherNestedAccessor>& other); constexpr scaled_accessor(const ScalingFactor& s, const NestedAccessor& a); constexpr reference access(data_handle_type p, size_t i) const; constexpr offset_policy::data_handle_type offset(data_handle_type p, size_t i) const; constexpr const ScalingFactor& scaling_factor() const noexcept { return *scaling-factor*; }constexpr const NestedAccessor& nested_accessor() const noexcept { return *nested-accessor*; }private: ScalingFactor *scaling-factor*{}; // *exposition only* NestedAccessor *nested-accessor*{}; // *exposition only*};}

[2](#scaledaccessor-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12631)

*Mandates*: 

- [(2.1)](#scaledaccessor-2.1)

element_type is valid and denotes a type,

- [(2.2)](#scaledaccessor-2.2)

is_copy_constructible_v<reference> is true,

- [(2.3)](#scaledaccessor-2.3)

is_reference_v<element_type> is false,

- [(2.4)](#scaledaccessor-2.4)

ScalingFactor models [semiregular](concepts.object#concept:semiregular "18.6 Object concepts [concepts.object]"), and

- [(2.5)](#scaledaccessor-2.5)

NestedAccessor meets the accessor policy requirements ([[mdspan.accessor.reqmts]](mdspan.accessor.reqmts "23.7.3.5.2 Requirements"))[.](#scaledaccessor-2.sentence-1)

[ð](#lib:scaled_accessor,constructor)

`template<class OtherNestedAccessor>
  explicit(!is_convertible_v<OtherNestedAccessor, NestedAccessor>)
    constexpr scaled_accessor(const scaled_accessor<ScalingFactor, OtherNestedAccessor>& other);
`

[3](#scaledaccessor-3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12654)

*Constraints*: is_constructible_v<NestedAccessor, const OtherNestedAccessor&> is true[.](#scaledaccessor-3.sentence-1)

[4](#scaledaccessor-4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12658)

*Effects*: 

- [(4.1)](#scaledaccessor-4.1)

Direct-non-list-initializes *scaling-factor* with other.scaling_factor(), and

- [(4.2)](#scaledaccessor-4.2)

direct-non-list-initializes *nested-accessor* with other.nested_accessor()[.](#scaledaccessor-4.sentence-1)

[ð](#lib:scaled_accessor,constructor_)

`constexpr scaled_accessor(const ScalingFactor& s, const NestedAccessor& a);
`

[5](#scaledaccessor-5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12676)

*Effects*: 

- [(5.1)](#scaledaccessor-5.1)

Direct-non-list-initializes *scaling-factor* with s, and

- [(5.2)](#scaledaccessor-5.2)

direct-non-list-initializes *nested-accessor* with a[.](#scaledaccessor-5.sentence-1)

[ð](#lib:scaled_accessor,access)

`constexpr reference access(data_handle_type p, size_t i) const;
`

[6](#scaledaccessor-6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12692)

*Returns*: scaling_factor() * NestedAccessor::element_type(*nested-accessor*.access(p, i))

[ð](#lib:scaled_accessor,offset)

`constexpr offset_policy::data_handle_type offset(data_handle_type p, size_t i) const;
`

[7](#scaledaccessor-7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12705)

*Returns*: *nested-accessor*.offset(p, i)

#### [29.9.8.3](#scaled) Function template scaled [[linalg.scaled.scaled]](linalg.scaled.scaled)

[1](#scaled-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12712)

The scaled function template takes
a scaling factor alpha and
an mdspan x, and
returns a new read-only mdspan with the same domain as x,
that represents the elementwise product of alpha with each element of x[.](#scaled-1.sentence-1)

[ð](#lib:scaled)

`  template<class ScalingFactor,
           class ElementType, class Extents, class Layout, class Accessor>
    constexpr auto scaled(ScalingFactor alpha, mdspan<ElementType, Extents, Layout, Accessor> x);
`

[2](#scaled-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12728)

Let SA be scaled_accessor<ScalingFactor, Accessor>[.](#scaled-2.sentence-1)

[3](#scaled-3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12731)

*Returns*: mdspan<typename SA::element_type, Extents, Layout, SA>(x.data_handle(), x.mapping(),
 SA(alpha, x.accessor()))

[4](#scaled-4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/numerics.tex#L12739)

[*Example [1](#scaled-example-1)*: void test_scaled(mdspan<double, extents<int, 10>> x){auto x_scaled = scaled(5.0, x); for (int i = 0; i < x.extent(0); ++i) { assert(x_scaled[i] == 5.0 * x[i]); }} â *end example*]
