mirror of
https://github.com/gonum/gonum.git
synced 2025-10-06 07:37:03 +08:00
mat: add non-conjugate transpose for complex matrices
This commit is contained in:
@@ -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{}
|
||||
|
Reference in New Issue
Block a user