github.com/neugram/ng@v0.0.0-20180309130942-d472ff93d872/eval/testdata/mat.ng (about) 1 // This package exports symbols and is used by other testdata. 2 3 type Matrix interface { 4 At(i, j int) float64 5 Set(i, j int, v float64) 6 Add(m Matrix) Matrix 7 Equal(m Matrix) bool 8 } 9 10 methodik memMatrix struct { 11 Rows int 12 Cols int 13 Stride int 14 Data []float64 15 } { 16 func (*m) offset(i, j int) int { 17 if i < 0 || i >= m.Rows || j < 0 || j >= m.Cols { 18 panic("matrix position out of bounds") 19 } 20 return i*m.Stride + j 21 } 22 func (*m) At(i, j int) float64 { return m.Data[m.offset(i, j)] } 23 func (*m) Set(i, j int, v float64) { m.Data[m.offset(i, j)] = v } 24 func (*m) Add(m2 Matrix) Matrix { 25 m3 := &memMatrix{Rows: m.Rows, Cols: m.Cols, Stride: m.Cols, Data: make([]float64, m.Rows*m.Cols)} 26 27 // Silly implementation, this is not meant for serious programs. 28 for i := 0; i < m.Rows; i++ { 29 for j := 0; j < m.Cols; j++ { 30 m3.Set(i, j, m.At(i, j)+m2.At(i, j)) 31 } 32 } 33 return m3 34 } 35 func (*m) Equal(m2 Matrix) bool { 36 if m.Rows != m2.(*memMatrix).Rows || m.Cols != m2.(*memMatrix).Cols { 37 return false 38 } 39 for i := 0; i < m.Rows; i++ { 40 for j := 0; j < m.Cols; j++ { 41 if m.At(i, j) != m2.At(i, j) { 42 return false 43 } 44 } 45 } 46 return true 47 } 48 } 49 50 func New(i, j int) Matrix { 51 return &memMatrix{Rows: i, Cols: j, Stride: j, Data: make([]float64, i*j)} 52 } 53 54 print("OK")