For non-complex matrices, the ConjugateTranspose is the same
as the transpose. Therefore, a sealed override for
ConjugateTranspose() that simply forwards the call to Transpose()
makes sense for double/single matrices.
Signed-off-by: Alexander Karatarakis <alex@karatarakis.com>
Change LeftMultiply to a protected method (from protected abstract) and it now
calls TransposeThisAndMultiply(). TransposeThisAndMultiply has unit tests
so it was chosen as the "main" method. Overrides of LeftMultiply were removed,
because now only TransposeThisAndMultiply() needs to be overriden.
Signed-off-by: Alexander Karatarakis <alex@karatarakis.com>
The formulas found in various references do not have abs. Furthermore,
when multiplying A*A^T or A^T*A (for the frobenius norm we only care
about the diagonal so it doesn't matter which product is used) the
i-ith diagonal element of the final matrix comes from the multiplication
of line i with itself. Therefore, all numbers involved will be multiplied
with themselves resulting in numbers that are always non-negative.
Signed-off-by: Alexander Karatarakis <alex@karatarakis.com>