1 缘起
期望对于算法的理解并不停留在python api层面,使用go语言实现加深理解,回避复杂的指针操作,同时绕开冗杂的c++语法
另外,go语言的低硬件资源消耗便于移植到更廉价的芯片以降低成本,同时期望利用go的分布式特性实现大型的矩阵运算处理(如特征值问题)
同时,使用go的算法库更利于云端的调用,更便捷地编译为客户端程序(比如结合h5实现科学计算器)
2 思路
使用切片表示矩阵,优势在于函数定义时无需将矩阵宽高写死
关键点在于一维切片创建
3 实现
3.1 矩阵加法与乘法实现
/**
矩阵加法
a b均为m行n列
*/
func addMatrix(a [][]int, b [][]int, m int, n int) [][]int {
res := make([][]int, m)
for i := 0; i < m; i++ {
resI := make([]int, n)
for j := 0; j < n; j++ {
resI[j] = a[i][j] + b[i][j]
}
res[i] = resI
}
return res
}
/**
矩阵乘法
a为m行k列, b为k行n列
*/
func mulMatrix(a [][]int, b [][]int, m int, n int, k int) [][]int {
res := make([][]int, m)
for i := 0; i < m; i++ {
resI := make([]int, k)
for j := 0; j < n; j++ {
for kk := 0; kk < k; kk++ {
resI[kk] += a[i][j] * b[j][kk]
}
}
res[i] = resI
}
return res
}
3.2 使用lorca创建客户端程序
lorca可结合go与h5创建客户端程序,其实是复用了chrome程序,然后可以使用js调用go的函数
这里仅采用了vue做演示,后续考虑采取组件库\echarts\canvas等
考虑到性能js仅作数据处理和展示,计算任务均交给go处理
实现不用多说,在官方demo基础上改为vue的语法格式,并对数据做简单处理即可
可以考虑的体验优化:
- 做成命令行交互的方式省去每个单元格输入的繁琐,copy操作
- 使用语法规则快速生成常用的矩阵,如0矩阵\单位矩阵等
4 展望
- 科学计算器
- 矩阵分解,分布式任务调度实现运算加速
- 重写pandas numpy sklearn等python库
- 移植到stm32等芯片
- matlab的go云版
5 网络资源
可以参考其关于结构体的封装,以及模块的划分等
GO矩阵库有哪些? cloud.tencent.com/developer/a…
golang 矩阵乘法、行列式、求逆矩阵 www.cnblogs.com/zheng123/p/…
a 更新记录
======================
2021-10-15 11:00
删除部分测试性代码突出重点
补充现有的网络资源的实现方案
======================
2021-10-17 23:00
补充矩阵加法\乘法的客户端效果