package matrix
import ("math"
"github.com/astaxie/beego")
type Matrix4struct{
Elements [16]float64 `json:"elements"`
}
type SQstruct{//矩阵结构
M,N int //m是列数,n是行数
Data [][]float64
}//矩阵定义
func (this*SQ)Set(m int,n int,data []float64) {//m是列数,n是行数,data是矩阵数据(从左到右由上到下填充)
this.M=mthis.N=nif 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++{vartmpArr []float64for 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
t :=[]float64{}for j:=0;j
r := float64(0)for k:=0;k
r+= a.Data[i][k]*b.Data[k][j]
}
t=append(t, r)
}
res=append(res,t)
}returnres
}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
varNum float64varB [][]float64if N>0{
Cha=0
for i := 0; i < N; i++{vartmpArr []float64for 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循环
returnNum
}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
varB [][]float64for i := 0; i < N; i++{vartmpArr []float64for j := 0; j < N; j++{
tmpArr= append(tmpArr, 0)
}
B=append(B, tmpArr)
}
Chay := 0Chax := 0
varadd 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
Chax= 0}else{
Chax= 1}for T2=0;T2<=N-1;T2++{if T2
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)))
}
}returnMatrixC
}