| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- package main
- type Matrix []Vector
- func MakeMatrix(n, m int) Matrix {
- M := make(Matrix, n)
- for i := 0; i < n; i++ {
- M[i] = MakeVector(m)
- }
- return M
- }
- func MakeRandomMatrix(n, m int) Matrix {
- M := make(Matrix, n)
- for i := 0; i < n; i++ {
- M[i] = MakeRandomVector(m)
- }
- return M
- }
- func (A Matrix) N() int {
- return len(A)
- }
- func (A Matrix) M() int {
- return A[0].N()
- }
- func (A Matrix) Transpose() Matrix {
- B := MakeMatrix(A.M(), A.N())
- for i := 0; i < A.N(); i++ {
- for j := 0; j < A.M(); j++ {
- B[j][i] = A[i][j]
- }
- }
- return B
- }
- func (A Matrix) Add(B Matrix) {
- if A.N() != B.N() || A.M() != B.M() {
- panic("Incompatible Dimensions")
- }
- for i := 0; i < A.N(); i++ {
- for j := 0; j < A.M(); j++ {
- A[i][j] += B[i][j]
- }
- }
- }
- func (A Matrix) Sub(B Matrix) {
- if A.N() != B.N() || A.M() != B.M() {
- panic("Incompatible Dimensions")
- }
- for i := 0; i < A.N(); i++ {
- for j := 0; j < A.M(); j++ {
- A[i][j] -= B[i][j]
- }
- }
- }
- func (A Matrix) Divide(b float64) {
- for i := 0; i < A.N(); i++ {
- for j := 0; j < A.M(); j++ {
- A[i][j] /= b
- }
- }
- }
- func Multiply(A, B Matrix) Matrix {
- if A.M() != B.N() {
- panic("Incompatible Dimensions")
- }
- C := MakeMatrix(A.N(), B.M())
- for i := 0; i < A.N(); i++ {
- for j := 0; j < A.M(); j++ {
- if A[i][j] != 0 {
- for k := 0; k < B.M(); k++ {
- if B[j][k] != 0 {
- C[i][k] += A[i][j] * B[j][k]
- }
- }
- }
- }
- }
- return C
- }
|