Skip to content
This repository has been archived by the owner on Dec 10, 2018. It is now read-only.

Commit

Permalink
Special case Vector.MulVec for Triangular and add tests for TriDense …
Browse files Browse the repository at this point in the history
…and SymDense
  • Loading branch information
btracey committed Jun 1, 2015
1 parent 105860e commit 7ad008e
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
8 changes: 8 additions & 0 deletions mat64/vector.go
Expand Up @@ -232,6 +232,14 @@ func (v *Vector) MulVec(a Matrix, trans bool, b *Vector) {
case RawSymmetricer:
amat := a.RawSymmetric()
blas64.Symv(1, amat, b.mat, 0, w.mat)
case RawTriangular:
w.CopyVec(b)
amat := a.RawTriangular()
ta := blas.NoTrans
if trans {
ta = blas.Trans
}
blas64.Trmv(ta, amat, w.mat)
case RawMatrixer:
amat := a.RawMatrix()
t := blas.NoTrans
Expand Down
48 changes: 48 additions & 0 deletions mat64/vector_test.go
Expand Up @@ -153,6 +153,54 @@ func (s *S) TestVectorMul(c *check.C) {
same = v3.EqualsApproxVec(&v2, 1e-14)
c.Check(same, check.Equals, true, check.Commentf("Test %d Vectorer T", i))
}
// Test symmetric and triangular cases
for _, n := range []int{3, 5, 8} {
vData := make([]float64, n)
for i := range vData {
vData[i] = rand.Float64()
}
v := NewVector(n, vData)
data := make([]float64, n*n)
for i := range data {
data[i] = rand.Float64()
}
var dense Dense
var got Vector
var want Vector

triUpper := NewTriDense(n, true, data)
dense.Clone(triUpper)
got.MulVec(triUpper, false, v)
want.MulVec(&dense, false, v)
same := want.EqualsApproxVec(&got, 1e-14)
c.Check(same, check.Equals, true, check.Commentf("Test %d Tri", n))
got.MulVec(triUpper, true, v)
want.MulVec(&dense, true, v)
same = want.EqualsApproxVec(&got, 1e-14)
c.Check(same, check.Equals, true, check.Commentf("Test %d Tri", n))

triLower := NewTriDense(n, false, data)
dense.Clone(triLower)
got.MulVec(triLower, false, v)
want.MulVec(&dense, false, v)
same = want.EqualsApproxVec(&got, 1e-14)
c.Check(same, check.Equals, true, check.Commentf("Test %d Tri", n))
got.MulVec(triLower, true, v)
want.MulVec(&dense, true, v)
same = want.EqualsApproxVec(&got, 1e-14)
c.Check(same, check.Equals, true, check.Commentf("Test %d Tri", n))

sym := NewSymDense(n, data)
dense.Clone(sym)
got.MulVec(sym, false, v)
want.MulVec(&dense, false, v)
same = want.EqualsApproxVec(&got, 1e-14)
c.Check(same, check.Equals, true, check.Commentf("Test %d Tri", n))
got.MulVec(sym, true, v)
want.MulVec(&dense, true, v)
same = want.EqualsApproxVec(&got, 1e-14)
c.Check(same, check.Equals, true, check.Commentf("Test %d Tri", n))
}
}

func (s *S) TestVectorAdd(c *check.C) {
Expand Down

0 comments on commit 7ad008e

Please sign in to comment.