52 lines
1.1 KiB
Go
52 lines
1.1 KiB
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
type matrix struct {
|
|
ele []float64
|
|
stride int
|
|
}
|
|
|
|
// construct new matrix from slice of slices
|
|
func matrixFromRows(rows [][]float64) *matrix {
|
|
if len(rows) == 0 {
|
|
return &matrix{nil, 0}
|
|
}
|
|
m := &matrix{make([]float64, len(rows)*len(rows[0])), len(rows[0])}
|
|
for rx, row := range rows {
|
|
copy(m.ele[rx*m.stride:(rx+1)*m.stride], row)
|
|
}
|
|
return m
|
|
}
|
|
|
|
func main() {
|
|
m := matrixFromRows([][]float64{
|
|
{1, 2, 3},
|
|
{4, 5, 6},
|
|
})
|
|
m.print("original:")
|
|
m.transpose().print("transpose:")
|
|
}
|
|
|
|
func (m *matrix) print(heading string) {
|
|
if heading > "" {
|
|
fmt.Print("\n", heading, "\n")
|
|
}
|
|
for e := 0; e < len(m.ele); e += m.stride {
|
|
fmt.Println(m.ele[e : e+m.stride])
|
|
}
|
|
}
|
|
|
|
func (m *matrix) transpose() *matrix {
|
|
r := &matrix{make([]float64, len(m.ele)), len(m.ele) / m.stride}
|
|
rx := 0
|
|
for _, e := range m.ele {
|
|
r.ele[rx] = e
|
|
rx += r.stride
|
|
if rx >= len(r.ele) {
|
|
rx -= len(r.ele) - 1
|
|
}
|
|
}
|
|
return r
|
|
}
|