/gt/matrix.go

https://code.google.com/p/go-gt/ · Go · 130 lines · 112 code · 17 blank · 1 comment · 30 complexity · d3d8d56e0486c547718dba35e68c9d1d MD5 · raw file

  1. package gt
  2. import (
  3. "bufio"
  4. "fmt"
  5. "math/rand"
  6. "strconv"
  7. )
  8. type Vector []int64
  9. type Matrix struct {
  10. N int64
  11. A []int64
  12. }
  13. func NewMatrix(n int64) (m *Matrix) {
  14. m = new(Matrix)
  15. m.N = n
  16. m.A = make([]int64, n*n)
  17. return m
  18. }
  19. func (m Matrix) Get(i int64, j int64) int64 {
  20. return m.A[i*m.N+j]
  21. }
  22. func (m Matrix) Set(i int64, j int64, v int64) {
  23. m.A[i*m.N+j] = v
  24. }
  25. func (p Vector) Swap(i int64, j int64) {
  26. x := p[i]
  27. p[i] = p[j]
  28. p[j] = x
  29. }
  30. func (v Vector) Len() int64 {
  31. return int64(len(v))
  32. }
  33. func (v Vector) Copy(w Vector) {
  34. for i := 0; i < len(v); i++ {
  35. v[i] = w[i]
  36. }
  37. }
  38. func (v Vector) Print() {
  39. for i := 0; i < len(v); i++ {
  40. fmt.Printf("%d ", v[i])
  41. }
  42. fmt.Print("\n")
  43. }
  44. func (m *Matrix) Print() {
  45. var i, j int64
  46. for i = 0; i < m.N; i++ {
  47. for j = 0; j < m.N; j++ {
  48. fmt.Printf("%d ", m.Get(i, j))
  49. }
  50. fmt.Print("\n")
  51. }
  52. }
  53. // generate a random permutation p
  54. func Perm(p Vector) {
  55. n := int64(len(p))
  56. var i int64
  57. for i = 0; i < n; i++ {
  58. p[i] = int64(i)
  59. }
  60. for i = 0; i < n; i++ {
  61. p.Swap(i, i+rand.Int63n(n-i))
  62. }
  63. }
  64. func skip(rd *bufio.Reader) {
  65. var b byte = ' '
  66. var err error
  67. for b == ' ' || b == '\t' || b == '\n' {
  68. b, err = rd.ReadByte()
  69. if err != nil {
  70. return
  71. }
  72. }
  73. rd.UnreadByte()
  74. }
  75. func wskip(s string) string {
  76. for i := 0; i < len(s); i++ {
  77. if s[i] != ' ' && s[i] != '\t' {
  78. return s[i:]
  79. }
  80. }
  81. return ""
  82. }
  83. func end(s string) (i int64) {
  84. for i = 0; i < int64(len(s)); i++ {
  85. if s[i] == ' ' || s[i] == '\t' || s[i] == '\n' {
  86. return i
  87. }
  88. }
  89. return 0
  90. }
  91. func readUint(s string) (int64, int64) {
  92. i := end(s)
  93. x, _ := strconv.ParseInt(s[:i], 10, 64)
  94. return int64(x), i
  95. }
  96. func readMatrix(rd *bufio.Reader, n int64) *Matrix {
  97. M := NewMatrix(n)
  98. var i, j int64
  99. for i = 0; i < n; i++ {
  100. skip(rd)
  101. line, _ := rd.ReadString('\n')
  102. for j = 0; j < n; j++ {
  103. line = wskip(line)
  104. x, p := readUint(line)
  105. M.Set(j, i, x)
  106. if p == 0 {
  107. panic("bad int")
  108. }
  109. line = line[p:]
  110. }
  111. }
  112. return M
  113. }