用 Golang 实现矩阵运算库

这篇具有很好参考价值的文章主要介绍了用 Golang 实现矩阵运算库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

天下文章一大抄
抄过来的 转载的 别来沾边😅 本来想在网上找一个现成的,没想到一个个都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 没有提前定义,因此没办法写入数值文章来源地址https://www.toymoban.com/news/detail-527525.html

到了这里,关于用 Golang 实现矩阵运算库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Golang中的运算符

      目录 运算符 算术运算符 代码案例: 关系运算符 代码案例: 逻辑运算符 代码案例: 位运算符 代码案例: 赋值运算符 代码案例: 其他运算符 Go语言中的算术运算符包括加、减、乘、除和取模等。需要注意的是,除法运算符/和取模运算符%只能用于整数类型,而不能用于

    2024年02月04日
    浏览(38)
  • 【Java|golang】2103. 环和杆---位运算

    总计有 n 个环,环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings ,表示这 n 个环在杆上的分布。rings 中每两个字符形成一个 颜色位置对 ,用于描述每个环: 第 i 对中的 第一个 字符表示第 i 个环的 颜色(‘

    2024年02月06日
    浏览(35)
  • 【golang项目-GeeCache】动手写分布式缓存 day1 - 实现LRU算法

    【go项目-geecache】动手写分布式缓存 - day1 - 实现LRU算法 【go项目-geecache】动手写分布式缓存 - day2 - 单机并发缓存 【go项目-geecache】动手写分布式缓存 - day3 - HTTP 服务端 【go项目-geecache】动手写分布式缓存 - day4 - 一致性哈希(hash) 【go项目-geecache】动手写分布式缓存 - day5 - 分布

    2023年04月20日
    浏览(39)
  • 【Java|golang】2679. 矩阵中的和

    给你一个下标从 0 开始的二维整数数组 nums 。一开始你的分数为 0 。你需要执行以下操作直到矩阵变为空: 矩阵中每一行选取最大的一个数,并删除它。如果一行中有多个最大的数,选择任意一个并删除。 在步骤 1 删除的所有数字中找到最大的一个数字,将它添加到你的 分

    2024年02月12日
    浏览(39)
  • 【HNU分布式与云计算系统】MPI实现矩阵乘矩阵运算

    实验环境 操作系统:Ubuntu 20.04 编程语言:C++ 实验原理 什么是MPI MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和

    2023年04月08日
    浏览(35)
  • 【基础算法】矩阵的几种基本运算 & C++实现

            从线性代数中我们已知,两个矩阵可以进行加减乘运算,但矩阵之间没有除法运算。(下面以3×3矩阵为例):          矩阵的数乘运算类属与两矩阵相乘的一种特殊形式(数乘矩阵的这个数,我们可以将其化为对角线为该数,其余位置都为0的矩阵,再用该对

    2024年02月11日
    浏览(48)
  • 【华为OD机试真题 Golang语言】68、矩阵扩散 | 机试真题+思路参考+代码分析

    🍂个人博客首页: KJ.JK   🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Golang语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习 🎃题目描述 存在一个m*n的二维数组,其成员取值范围为0或

    2024年02月03日
    浏览(54)
  • 算法 in Golang:Recursion(递归)

    while 没找到: if 当前项 is 宝石: return 宝石 else if 当前项 is 套娃: 打开这个套娃 if 当前项 is 宝石: return 宝石 else if 当前项 is 套娃: 打开这个套娃 if 当前项 is 宝石: ... ... 打开套娃 找到的是宝石,结束 得到的是一个套娃(重复操作,再次打开套娃,进行判断...) 递归

    2024年02月08日
    浏览(38)
  • golang,OpenGL,计算机图形学(三)

    代码仓库 https://github.com/phprao/go-graphic 颜色 光源照射到物体上,一部分颜色被吸收,另一部分无法吸收的被反射到人眼,于是呈现出了颜色。 当我们把光源的颜色与物体的颜色值 相乘 (而不是点乘),所得到的就是这个物体所反射的颜色。由此,我们可以定义物体的颜色为

    2024年02月12日
    浏览(44)
  • 算法 in Golang:Quicksort(快速排序)

    快速排序 O(nlog2^n),比选择排序要快 O(n²) 在日常生活中经常使用 使用了 D C 策略(分而治之) 不需要排序的数组(也就是 Base Case 基线条件): [],空数组 [s],单元素数组 很容易排序的数组: [a, b],两个元素的数组,只需检查它们之间的大小即可,调换位置 3 个元素的数组

    2024年02月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包