我有下面的代码使用Go语言的矩阵乘法
func main() {
var wg sync.WaitGroup
var col = 100
var row = 150
var randMatrixA [][]int
var randMatrixB [][]int
chA := make(chan [][]int)
chB := make(chan [][]int)
wg.Add(1)
go genMat(row, col, chA, &wg)
wg.Add(1)
go genMat(col, row, chB, &wg)
wg.Wait()
randMatrixA = <-chA
randMatrixB = <-chB
fmt.Println(randMatrixA)
fmt.Println(randMatrixB)
fmt.Println("The Go Result of Matrix Multiplication = ")
start := time.Now()
c := doCalc(randMatrixA, randMatrixB)
elapsed := time.Since(start)
fmt.Println(c)
fmt.Printf("Time taken to calculate %s \n", elapsed)
}
func genMat(row int, col int, ch chan<- [][]int, wg *sync.WaitGroup) {
nM := make([][]int, col)
for i := 0; i < col; i++ {
nM[i] = make([]int, row)
}
generateNums(nM)
wg.Done()
ch <- nM
}
func generateNums(randMatrix [][]int) {
for i, innerArray := range randMatrix {
for j := range innerArray {
randMatrix[i][j] = rand.Intn(100)
}
}
}
func rowCount(inM [][]int) int {
return (len(inM))
}
func colCount(inM [][]int) int {
return (len(inM[0]))
}
func doCalc(inA [][]int, inB [][]int) [][]int {
var i, j int
var wg sync.WaitGroup
chC := make(chan [][]int)
m := rowCount(inA) // number of rows the first matrix
p := rowCount(inB) // number of rows the second matrix
q := colCount(inB) // number of columns the second matrix
k := 0
total := 0
var nM [][]int
wg.Add(1)
go genMat(m, q, chC, &wg)
nM = <-chC
wg.Wait()
for i = 0; i < m; i++ {
for j = 0; j < q; j++ {
for k = 0; k < p; k++ {
total = total + inA[i][k]*inB[k][j]
}
nM[i][j] = total
total = 0
}
fmt.Println()
}
return nM
}
字符集
我使用Go例程来优化执行。两个go例程随机生成matrixA和MatrixB,另一个计算结果MatrixC
总执行时间平均约为2.4 ms,但我希望它在1到2 ms之间,甚至更短。
有没有人可以通过使用go例程而不使用内置函数来建议代码中的优化区域:)
1条答案
按热度按时间qnyhuwrf1#
为什么不使用默认库包?
https://pkg.go.dev/gonum.org/v1/gonum/mat
我实现了,它比你的算法快(~1.1ms,多次运行结果如下)。
验证码:
字符集
运行时间(多次运行):
型