• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

用 Golang 实现矩阵运算库

武飞扬头像
wx-zhou
帮助1

天下文章一大抄
抄过来的 转载的 别来沾边😅 本来想在网上找一个现成的,没想到一个个都tmd是抄来的 抄还抄个错的 捏麻麻滴

那我就根据网上已有的代码 将错误的地方改掉 写了一个可以使用运行的库

package matrix

import (
	"math"
)

type SQ struct {
	//矩阵结构
	N, M 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 {
		// "矩阵定义失败"
		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 {
			// ("矩阵定义失败")
			return
		}
	}
}

// a的列数和b的⾏数相等
// 矩阵乘法
func Mul(a SQ, b SQ) [][]float64 {
	if a.M == b.N {
		res := [][]float64{}
		// 以A行乘以B列
		for i := 0; i < a.N; i   {
			t := []float64{}
			// a.data[i] 是第 i 1 行
			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 {
		// "两矩阵⽆法进⾏相乘运算")
		return [][]float64{}
	}
}

// 矩阵转置
func Transpose(a SQ) SQ {
	var b SQ
	b.M = a.N
	b.N = a.M
	var res = [][]float64{}

	for i := 0; i < a.M; i   {
		var t = []float64{}
		for j := 0; j < a.N; j   {
			t = append(t, a.Data[j][i])
		}
		res = append(res, t)
	}
	b.Data = res
	return 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(S1 SQ) (MatrixC [][]float64) {
	N := S1.N - 1
	Matrix := S1.Data
	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)
	}

	for i := 0; i < N 1; i   {
		var tmpArr []float64
		for j := 0; j < N 1; j   {
			tmpArr = append(tmpArr, 0)
		}
		MatrixC = append(MatrixC, 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
}

学新通

其他博客错的地方:
1、 矩阵相乘是要求 A 矩阵的列数要和 B 矩阵的行数相等,他们一个个就会对着抄,里面全是 a.M == b.M , 同样对应 b.Data 的索引也要改一下

2、 求矩阵的逆要求必须是方阵, 因为方阵才能算行列式的值,这里计算矩阵的逆用的是:A-1 = A* / |A|
A* 是 A 的伴随矩阵(不知道伴随矩阵就先去了解下)
然后其他博客算逆的时候肯定会报超出索引,因为他们的 MatrixC 没有提前定义,因此没办法写入数值

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfibcg
系列文章
更多 icon
同类精品
更多 icon
继续加载