spmv

@trusted pure @nogc nothrow
void
spmv
(
T
SliceKind kindX
SliceKind kindY
string type
)
(,
Slice!(StairsIterator!(T*, type)) a
,
Slice!(const(T)*, 1, kindX) x
,,
Slice!(T*, 1, kindY) y
)
if (
type == "+" ||
type == "-"
)

Examples

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

auto result = [8.0, 14, 8].sliced;

auto A = [1.0, 2, 3, 1, 2, 1].stairs!"+"(3);
auto x = [1.0, 2, 3].sliced;
auto output = uninitSlice!double(3);

spmv(1.0, A, x, 0.0, output);
assert(output.equal(result));
import mir.algorithm.iteration: equal;
import mir.ndslice.allocation: uninitSlice;
import mir.ndslice.slice: sliced;
import mir.ndslice.topology: stairs;

auto result = [14.0, 10, 10].sliced;

auto A = [1.0, 2, 3, 1, 2, 1].stairs!"-"(3);
auto x = [1.0, 2, 3].sliced;
auto output = uninitSlice!double(3);

spmv(1.0, A, x, 0.0, output);
assert(output.equal(result));