forked from go/golangs_learn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
2.9 KiB
160 lines
2.9 KiB
package main
|
|
|
|
import (
|
|
"github.com/astaxie/beego"
|
|
"math"
|
|
)
|
|
|
|
type Matrix4 struct {
|
|
Elements [16]float64 `json:"elements"`
|
|
}
|
|
|
|
type SQ struct {
|
|
//矩阵结构
|
|
M, N int //m是列数,n是行数
|
|
Data [][]float64
|
|
}
|
|
|
|
//矩阵定义
|
|
func (this *SQ) Set(m int, n int, data []float64) {
|
|
//m是列数,n是行数,data是矩阵数据(从左到右由上到下填充)
|
|
this.M = m
|
|
this.N = n
|
|
if len(data) != this.M*this.N {
|
|
beego.Debug("矩阵定义失败")
|
|
return
|
|
} else {
|
|
k := 0
|
|
if this.M*this.N == len(data) {
|
|
for i := 0; i < this.N; i++ {
|
|
var tmpArr []float64
|
|
for j := 0; j < this.M; j++ {
|
|
tmpArr = append(tmpArr, data[k])
|
|
k++
|
|
}
|
|
this.Data = append(this.Data, tmpArr)
|
|
}
|
|
} else {
|
|
beego.Debug("矩阵定义失败")
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
//a的列数和b的行数相等
|
|
//矩阵乘法
|
|
func Mul(a SQ, b SQ) [][]float64 {
|
|
if a.M == b.M {
|
|
res := [][]float64{}
|
|
for i := 0; i < a.M; i++ {
|
|
t := []float64{}
|
|
for j := 0; j < b.M; j++ {
|
|
r := float64(0)
|
|
for k := 0; k < a.M; k++ {
|
|
r += a.Data[i][k] * b.Data[k][j]
|
|
}
|
|
t = append(t, r)
|
|
}
|
|
res = append(res, t)
|
|
}
|
|
return res
|
|
} else {
|
|
beego.Debug("两矩阵无法进行相乘运算")
|
|
return [][]float64{}
|
|
}
|
|
/*一个应用的例子
|
|
a := [][]int{
|
|
{1,2},
|
|
{3,4},
|
|
{5,6},
|
|
}
|
|
b := [][]int{
|
|
{1,2,3},
|
|
{3,4,1},
|
|
}
|
|
A := SQ{
|
|
2,3,
|
|
a,
|
|
}
|
|
B := SQ{
|
|
3,2,
|
|
b,
|
|
}
|
|
|
|
res := mul(A,B)
|
|
*/
|
|
}
|
|
|
|
//计算n阶行列式(N=n-1)
|
|
func Det(Matrix [][]float64, N int) float64 {
|
|
var T0, T1, T2, Cha int
|
|
var Num float64
|
|
var B [][]float64
|
|
|
|
if N > 0 {
|
|
Cha = 0
|
|
for i := 0; i < N; i++ {
|
|
var tmpArr []float64
|
|
for j := 0; j < N; j++ {
|
|
tmpArr = append(tmpArr, 0)
|
|
}
|
|
B = append(B, tmpArr)
|
|
}
|
|
Num = 0
|
|
for T0 = 0; T0 <= N; T0++ { //T0循环
|
|
for T1 = 1; T1 <= N; T1++ { //T1循环
|
|
for T2 = 0; T2 <= N-1; T2++ { //T2循环
|
|
if T2 == T0 {
|
|
Cha = 1
|
|
}
|
|
B[T1-1][T2] = Matrix[T1][T2+Cha]
|
|
} //T2循环
|
|
Cha = 0
|
|
} //T1循环
|
|
Num = Num + Matrix[0][T0]*Det(B, N-1)*math.Pow(-1, float64(T0))
|
|
} //T0循环
|
|
return Num
|
|
} else if N == 0 {
|
|
return Matrix[0][0]
|
|
}
|
|
return 0
|
|
}
|
|
|
|
//矩阵求逆(N=n-1)
|
|
func Inverse(Matrix [][]float64, N int) (MatrixC [][]float64) {
|
|
var T0, T1, T2, T3 int
|
|
var B [][]float64
|
|
for i := 0; i < N; i++ {
|
|
var tmpArr []float64
|
|
for j := 0; j < N; j++ {
|
|
tmpArr = append(tmpArr, 0)
|
|
}
|
|
B = append(B, tmpArr)
|
|
}
|
|
Chay := 0
|
|
Chax := 0
|
|
var add float64
|
|
add = 1 / Det(Matrix, N)
|
|
for T0 = 0; T0 <= N; T0++ {
|
|
for T3 = 0; T3 <= N; T3++ {
|
|
for T1 = 0; T1 <= N-1; T1++ {
|
|
if T1 < T0 {
|
|
Chax = 0
|
|
} else {
|
|
Chax = 1
|
|
}
|
|
for T2 = 0; T2 <= N-1; T2++ {
|
|
if T2 < T3 {
|
|
Chay = 0
|
|
} else {
|
|
Chay = 1
|
|
}
|
|
B[T1][T2] = Matrix[T1+Chax][T2+Chay]
|
|
} //T2循环
|
|
} //T1循环
|
|
Det(B, N-1)
|
|
MatrixC[T3][T0] = Det(B, N-1) * add * (math.Pow(-1, float64(T0+T3)))
|
|
}
|
|
}
|
|
return MatrixC
|
|
}
|
|
|