trmv

@trusted pure nothrow @nogc
void
trmv
(
T
SliceKind kindA
SliceKind kindX
)
(
cblas.Uplo uplo
,
cblas.Diag diag
,
Slice!(const(T)*, 2, kindA) a
,
Slice!(T*, 1, kindX) x
)

Examples

Example: Upper/NonUnit

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

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

auto a = [3.0, 5, 2, 0, 2, 3, 0, 0, 1].sliced(3, 3);
auto b = [2.0, 3, 4].sliced(3);
trmv(cblas.Uplo.Upper, cblas.Diag.NonUnit, a, b);
assert(b.equal(result));

Example: Lower/NonUnit

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

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

auto a = [3.0, 0, 0, 5, 2, 0, 2, 3, 1].sliced(3, 3);
auto b = [2.0, 3, 4].sliced(3);
trmv(cblas.Uplo.Lower, cblas.Diag.NonUnit, a, b);
assert(b.equal(result));

Upper/NonUnit, but transposing first (so only diagonal is used)

import mir.algorithm.iteration: equal;
import mir.ndslice.dynamic: transposed;
import mir.ndslice.slice: sliced;

auto result = [6.0, 6, 4].sliced(3);

auto a = [3.0, 5, 2, 0, 2, 3, 0, 0, 1].sliced(3, 3).transposed;
auto b = [2.0, 3, 4].sliced(3);
trmv(cblas.Uplo.Upper, 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: universal;

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, 0, 2, 3, 0, 0, 1].sliced(3, 3);
auto b = [2.0, 3, 4].sliced(3);
trmv(cblas.Uplo.Upper, cblas.Diag.Unit, a, b);
assert(b.equal(result));