tpmv

@trusted pure nothrow @nogc
void
tpmv
(
T
SliceKind kindX
string type
)
(
cblas.Diag diag
,
Slice!(StairsIterator!(T*, type)) a
,
Slice!(T*, 1, kindX) x
)
if (
type == "+" ||
type == "-"
)

Examples

Example: Upper/NonUnit

import mir.algorithm.iteration: equal;
import mir.ndslice.slice: sliced;
import mir.ndslice.topology: stairs;

auto result = [29.0, 18, 4].sliced(3);

auto a = [3.0, 5, 2, 2, 3, 1].stairs!"-"(3);
auto b = [2.0, 3, 4].sliced(3);
tpmv(cblas.Diag.NonUnit, a, b);
assert(b.equal(result));

Example: Lower/NonUnit

import mir.algorithm.iteration: equal;
import mir.ndslice.slice: sliced;
import mir.ndslice.topology: stairs;

auto result = [6.0, 16, 17].sliced(3);

auto a = [3.0, 5, 2, 2, 3, 1].stairs!"+"(3);
auto b = [2.0, 3, 4].sliced(3);
tpmv(cblas.Diag.NonUnit, a, b);
assert(b.equal(result));

Example: Upper/Unit

import mir.algorithm.iteration: equal;
import mir.ndslice.slice: sliced;
import mir.ndslice.topology: stairs;

auto result = [25.0, 15, 4].sliced(3);

// Setting cblas.Diag.Unit assumes diagonals are 1s, even if they are not
auto a = [3.0, 5, 2, 2, 3, 1].stairs!"-"(3);
auto b = [2.0, 3, 4].sliced(3);
tpmv(cblas.Diag.Unit, a, b);
assert(b.equal(result));