matrix.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package main
  2. type Matrix []Vector
  3. func MakeMatrix(n, m int) Matrix {
  4. M := make(Matrix, n)
  5. for i := 0; i < n; i++ {
  6. M[i] = MakeVector(m)
  7. }
  8. return M
  9. }
  10. func MakeRandomMatrix(n, m int) Matrix {
  11. M := make(Matrix, n)
  12. for i := 0; i < n; i++ {
  13. M[i] = MakeRandomVector(m)
  14. }
  15. return M
  16. }
  17. func (A Matrix) N() int {
  18. return len(A)
  19. }
  20. func (A Matrix) M() int {
  21. return A[0].N()
  22. }
  23. func (A Matrix) Transpose() Matrix {
  24. B := MakeMatrix(A.M(), A.N())
  25. for i := 0; i < A.N(); i++ {
  26. for j := 0; j < A.M(); j++ {
  27. B[j][i] = A[i][j]
  28. }
  29. }
  30. return B
  31. }
  32. func (A Matrix) Add(B Matrix) Matrix {
  33. if A.N() != B.N() || A.M() != B.M() {
  34. panic("Incompatible Dimensions")
  35. }
  36. for i := 0; i < A.N(); i++ {
  37. for j := 0; j < A.M(); j++ {
  38. A[i][j] += B[i][j]
  39. }
  40. }
  41. return A
  42. }
  43. func (A Matrix) Sub(B Matrix) Matrix {
  44. if A.N() != B.N() || A.M() != B.M() {
  45. panic("Incompatible Dimensions")
  46. }
  47. for i := 0; i < A.N(); i++ {
  48. for j := 0; j < A.M(); j++ {
  49. A[i][j] -= B[i][j]
  50. }
  51. }
  52. return A
  53. }
  54. func (A Matrix) Multiply(B Matrix) Matrix {
  55. if A.M() != B.N() {
  56. panic("Incompatible Dimensions")
  57. }
  58. C := MakeMatrix(A.N(), B.M())
  59. for i := 0; i < A.N(); i++ {
  60. for j := 0; j < A.M(); j++ {
  61. if A[i][j] != 0 {
  62. for k := 0; k < B.M(); k++ {
  63. if B[j][k] != 0 {
  64. C[i][k] += A[i][j] * B[j][k]
  65. }
  66. }
  67. }
  68. }
  69. }
  70. return C
  71. }
  72. func (A Matrix) Divide(b float64) Matrix {
  73. if b == 1 {
  74. return A
  75. }
  76. for i := 0; i < A.N(); i++ {
  77. for j := 0; j < A.M(); j++ {
  78. A[i][j] /= b
  79. }
  80. }
  81. return A
  82. }
  83. func (A Matrix) Dropout(B Vector) Matrix {
  84. if A.M() != B.N() {
  85. panic("Incompatible Dimensions")
  86. }
  87. for i := 0; i < A.N(); i++ {
  88. for j := 0; j < A.M(); j++ {
  89. A[i][j] *= B[j]
  90. }
  91. }
  92. return A
  93. }