trmm

@trusted pure nothrow @nogc
void
trmm
(
T
SliceKind kindA
SliceKind kindB
)
(
cblas.Side side
,
cblas.Uplo uplo
,
cblas.Diag diag
,,
Slice!(const(T)*, 2, kindA) a
,
Slice!(T*, 2, kindB) b
)

Examples

Example: Left/Upper/NonUnit

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

auto result = [29.0, 18.0, 4.0].sliced(3, 1);

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

Example: Right/Upper/NonUnit

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

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

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

Example: Left/Lower/NonUnit

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

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

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

Example: Right/Lower/NonUnit

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

auto result = [29.0, 18.0, 4.0].sliced(1, 3);

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

Example: Left/Upper/Unit

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

auto result = [25.0, 15.0, 4.0].sliced(3, 1);

// 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).universal;
auto b = [2.0, 3, 4].sliced(3, 1).universal;
trmm(cblas.Side.Left, cblas.Uplo.Upper, cblas.Diag.Unit, 1.0, a, b);
assert(b.equal(result));

Example: Right/Upper/Unit

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

auto result = [2.0, 13, 17].sliced(1, 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).universal;
auto b = [2.0, 3, 4].sliced(1, 3).universal;
trmm(cblas.Side.Right, cblas.Uplo.Upper, cblas.Diag.Unit, 1.0, a, b);
assert(b.equal(result));