57 lines
1.3 KiB
Go
57 lines
1.3 KiB
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
type matrix struct {
|
|
stride int
|
|
ele []float64
|
|
}
|
|
|
|
func (m *matrix) print(heading string) {
|
|
if heading > "" {
|
|
fmt.Print("\n", heading, "\n")
|
|
}
|
|
for e := 0; e < len(m.ele); e += m.stride {
|
|
fmt.Printf("%8.3f ", m.ele[e:e+m.stride])
|
|
fmt.Println()
|
|
}
|
|
}
|
|
|
|
func (m1 *matrix) multiply(m2 *matrix) (m3 *matrix, ok bool) {
|
|
if m1.stride*m2.stride != len(m2.ele) {
|
|
return nil, false
|
|
}
|
|
m3 = &matrix{m2.stride, make([]float64, (len(m1.ele)/m1.stride)*m2.stride)}
|
|
for m1c0, m3x := 0, 0; m1c0 < len(m1.ele); m1c0 += m1.stride {
|
|
for m2r0 := 0; m2r0 < m2.stride; m2r0++ {
|
|
for m1x, m2x := m1c0, m2r0; m2x < len(m2.ele); m2x += m2.stride {
|
|
m3.ele[m3x] += m1.ele[m1x] * m2.ele[m2x]
|
|
m1x++
|
|
}
|
|
m3x++
|
|
}
|
|
}
|
|
return m3, true
|
|
}
|
|
|
|
func main() {
|
|
a := matrix{4, []float64{
|
|
1, 2, 3, 4,
|
|
5, 6, 7, 8,
|
|
}}
|
|
b := matrix{3, []float64{
|
|
1, 2, 3,
|
|
4, 5, 6,
|
|
7, 8, 9,
|
|
10, 11, 12,
|
|
}}
|
|
p, ok := a.multiply(&b)
|
|
a.print("Matrix A:")
|
|
b.print("Matrix B:")
|
|
if !ok {
|
|
fmt.Println("not conformable for matrix multiplication")
|
|
return
|
|
}
|
|
p.print("Product of A and B:")
|
|
}
|