mat: add non-conjugate transpose for complex matrices

This commit is contained in:
Dan Kortschak
2021-01-07 07:48:49 +10:30
committed by GitHub
parent 9076f1c7d1
commit 1c2011e56d
5 changed files with 335 additions and 38 deletions

View File

@@ -4,7 +4,12 @@
package mat
import "testing"
import (
"math/cmplx"
"testing"
"golang.org/x/exp/rand"
)
func TestCDenseNewAtSet(t *testing.T) {
t.Parallel()
@@ -48,6 +53,96 @@ func TestCDenseNewAtSet(t *testing.T) {
}
}
func TestCDenseConjElem(t *testing.T) {
t.Parallel()
rnd := rand.New(rand.NewSource(1))
for r := 1; r <= 8; r++ {
for c := 1; c <= 8; c++ {
const (
empty = iota
fit
sliced
self
)
for _, dst := range []int{empty, fit, sliced, self} {
const (
noTrans = iota
trans
conjTrans
bothHT
bothTH
)
for _, src := range []int{noTrans, trans, conjTrans, bothHT, bothTH} {
d := NewCDense(r, c, nil)
for i := 0; i < r; i++ {
for j := 0; j < c; j++ {
d.Set(i, j, complex(rnd.NormFloat64(), rnd.NormFloat64()))
}
}
var (
a CMatrix
op string
)
switch src {
case noTrans:
a = d
case trans:
r, c = c, r
a = d.T()
op = ".T"
case conjTrans:
r, c = c, r
a = d.H()
op = ".H"
case bothHT:
a = d.H().T()
op = ".H.T"
case bothTH:
a = d.T().H()
op = ".T.H"
default:
panic("invalid src op")
}
aCopy := NewCDense(r, c, nil)
aCopy.Copy(a)
var got *CDense
switch dst {
case empty:
got = &CDense{}
case fit:
got = NewCDense(r, c, nil)
case sliced:
got = NewCDense(r*2, c*2, nil).Slice(1, r+1, 1, c+1).(*CDense)
case self:
if r != c && (src == conjTrans || src == trans) {
continue
}
got = d
default:
panic("invalid dst size")
}
got.Conj(a)
for i := 0; i < r; i++ {
for j := 0; j < c; j++ {
if got.At(i, j) != cmplx.Conj(aCopy.At(i, j)) {
t.Errorf("unexpected results a%s[%d, %d] for r=%d c=%d %v != %v",
op, i, j, r, c, got.At(i, j), cmplx.Conj(a.At(i, j)),
)
}
}
}
}
}
}
}
}
func TestCDenseGrow(t *testing.T) {
t.Parallel()
m := &CDense{}