matrix.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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) {
  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. }
  42. func (A Matrix) Sub(B Matrix) {
  43. if A.N() != B.N() || A.M() != B.M() {
  44. panic("Incompatible Dimensions")
  45. }
  46. for i := 0; i < A.N(); i++ {
  47. for j := 0; j < A.M(); j++ {
  48. A[i][j] -= B[i][j]
  49. }
  50. }
  51. }
  52. func (A Matrix) Divide(b float64) {
  53. for i := 0; i < A.N(); i++ {
  54. for j := 0; j < A.M(); j++ {
  55. A[i][j] /= b
  56. }
  57. }
  58. }
  59. func Multiply(A, B Matrix) Matrix {
  60. if A.M() != B.N() {
  61. panic("Incompatible Dimensions")
  62. }
  63. C := MakeMatrix(A.N(), B.M())
  64. for i := 0; i < A.N(); i++ {
  65. for j := 0; j < A.M(); j++ {
  66. if A[i][j] != 0 {
  67. for k := 0; k < B.M(); k++ {
  68. if B[j][k] != 0 {
  69. C[i][k] += A[i][j] * B[j][k]
  70. }
  71. }
  72. }
  73. }
  74. }
  75. return C
  76. }