Example: Upper/NonUnit
import mir.algorithm.iteration: equal; import mir.ndslice.slice: sliced; auto result = [2.0, 3, 4].sliced(3); auto a = [3.0, 5, 2, 0, 2, 3, 0, 0, 1].sliced(3, 3); auto b = [29.0, 18, 4].sliced(3); trsv(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 = [2.0, 3, 4].sliced(3); auto a = [3.0, 0, 0, 5, 2, 0, 2, 3, 1].sliced(3, 3); auto b = [6.0, 16, 17].sliced(3); trsv(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 = [2.0, 3, 4].sliced(3); auto a = [3.0, 5, 2, 0, 2, 3, 0, 0, 1].sliced(3, 3).transposed; auto b = [6.0, 6, 4].sliced(3); trsv(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 = [2.0, 3, 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 = [25.0, 15, 4].sliced(3); trsv(cblas.Uplo.Upper, cblas.Diag.Unit, a, b); assert(b.equal(result));