mat: add VecDense.Permute

This commit is contained in:
Vladimir Chalupecky
2023-10-06 15:29:52 +02:00
committed by Vladimír Chalupecký
parent 6e2f5c5890
commit 78bc3a48bf
2 changed files with 52 additions and 0 deletions

View File

@@ -11,6 +11,7 @@ import (
"golang.org/x/exp/rand"
"gonum.org/v1/gonum/blas/blas64"
"gonum.org/v1/gonum/stat/combin"
)
func TestNewVecDense(t *testing.T) {
@@ -482,6 +483,41 @@ func TestVecDenseDivElem(t *testing.T) {
}
}
func TestVecDensePermute(t *testing.T) {
rnd := rand.New(rand.NewSource(1))
for n := 1; n <= 6; n++ {
for k, perm := range combin.Permutations(n, n) {
v := NewVecDense(n, nil)
for i := 0; i < n; i++ {
v.SetVec(i, rnd.Float64())
}
var p Dense
p.Permutation(n, perm)
var want VecDense
want.MulVec(&p, v)
var got VecDense
got.CloneFromVec(v)
got.Permute(perm, false)
if !Equal(&want, &got) {
t.Errorf("n=%d,k=%d: unexpected result after permutation\nwant=%v\n got=%v", n, k,
Formatted(want.T()), Formatted(got.T()))
}
var wantInv VecDense
wantInv.MulVec(p.T(), v)
var gotInv VecDense
gotInv.CloneFromVec(v)
gotInv.Permute(perm, true)
if !Equal(&wantInv, &gotInv) {
t.Errorf("n=%d,k=%d: unexpected result after inverse permutation\nwant=%v\n got=%v", n, k,
Formatted(wantInv.T()), Formatted(gotInv.T()))
}
}
}
}
func BenchmarkAddScaledVec10Inc1(b *testing.B) { addScaledVecBench(b, 10, 1) }
func BenchmarkAddScaledVec100Inc1(b *testing.B) { addScaledVecBench(b, 100, 1) }
func BenchmarkAddScaledVec1000Inc1(b *testing.B) { addScaledVecBench(b, 1000, 1) }